博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
17.在Action获取Scope对象
阅读量:6311 次
发布时间:2019-06-22

本文共 4032 字,大约阅读时间需要 13 分钟。

转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html

引言:在前面的Action操作中,关键就是Action中的exectue方法,但是此方法并没有request、session、application等对象作为参数,自然就不能利用这些对象来操作。下面我们建立struts2scope项目,并用四种方式来获取这些对象:

方式一、与Servlet解耦合的非IOC方式

获取的scope对象与容器无关,通过ActionContext获取。

LoginAction代码如下:

package com.asm;

public class LoginAction extends ActionSupport {

       private String username;

       ActionContext context;

       Map request;

       Map session;

       Map application;

       public String execute() throws Exception {

              context=ActionContext.getContext();

              request=(Map) context.get("request");

              session=context.getSession();

              application=context.getApplication();

             

              request.put("req", "requst属性");

              session.put("ses", "sesion属性");

              application.put("app", "application属性");

              return SUCCESS;

       }

       ...省略username的get/set方法

}

struts.xml配置如下:

<struts>

       <package name="scope" extends="struts-default">

              <action name="login" class="com.asm.LoginAction">

                     <result>/loginSuc.jsp</result>

</action>

</package>        

</struts>

login.jsp内容如下:

<form action="<%=request.getContextPath() %>/login.action">

              用户名:<input type="text" name="username"><br>

              <input type="submit" value="login">   

</form>

loginSuc.jsp的主要内容如下:

${requestScope.req}

${sessionScope.ses}

${applicationScope.app}

<h4>以下使用scope.getAttribute的形式来接受</h4>

              request:      <%=request.getAttribute("req") %><br>

              session:       <%=session.getAttribute("ses") %><br>

              application:<%=application.getAttribute("app") %><br>

分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在request范围中的对象。我们使用el或通过request.getAttribute这样的方式均可以获取对象值,这说明了这些Map request对象实际是存储在request范围内的对象。

方式二、与Servlet解耦合的IOC方式

我们建立Login2Action,主要代码如下:

package com.asm;

public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {

       private String username;

       Map request;

       Map session;

       Map application;

       public String execute() throws Exception {

              request.put("req", "requst属性");

              session.put("ses", "sesion属性");

              application.put("app", "application属性");

              return SUCCESS;

       }

       public void setRequest(Map<String, Object> request) {

              this.request=request;

       }

       public void setSession(Map<String, Object> session) {

              this.session=session;

       }

       public void setApplication(Map<String, Object> application) {

              this.application=application;

       }

       ...省略username的get/set方法    

}

注册此Action的name为login2,随后修改登录提交为.../login2.action。便可以发布测试。说明:此方法其实和方式一很相似,只是在方式一中我们需要手动的为Map request赋值,但是在方式二中它是通过实现接口,在重写接口中的方法中完成对Map requset的赋值,所以称之IOC方式。借助此例,略谈下依赖注入与控制反转:所谓依赖注入就是一个对象自己本身的初始化是依赖其它对象。比如这里Map request这些对象会依赖struts2来给其初始化,称为依赖注入,而依赖注入的就表示,这些对象的控制权不再由此类本身掌握,而是交给了别的对象,即是控制权反转了。 强调:方式二是开发中主要用的方式,应重点掌握

方式三、与Servlet耦合的非IOC方式

建立Login3Action,代码如下:

package com.asm;
public class Login3Action extends ActionSupport {

       private String username;

       HttpServletRequest request;

       HttpSession session;

       ServletContext application;

       public String execute() throws Exception {

              request = ServletActionContext.getRequest();

              session = request.getSession();

              application = ServletActionContext.getServletContext();

 

              request.setAttribute("req", "requst属性");

              session.setAttribute("ses", "sesion属性");

              application.setAttribute("app", "application属性");

              return SUCCESS;

       }

       ...省略username的get/set方法。

}

此方法获取的纯粹的Scope对象,它与容器相关,这些Scope对象操作更强。同样只需要注册此Action并修改登录页面便可进行测试。

方式四、与Servlet耦合的IOC方式

建立Login4Action,代码如下:

package com.asm;

public class Login4Action extends ActionSupport implements ServletRequestAware,ServletContextAware{

       private String username;

       ActionContext context;

       HttpServletRequest request;

       HttpSession session;

       ServletContext application;

       public String execute() throws Exception {

              context=ActionContext.getContext();

              session=request.getSession();   

              request.setAttribute("req", "requst属性");

              session.setAttribute("ses", "sesion属性");

              application.setAttribute("app", "application属性");

              return SUCCESS;

       }

      

       public void setServletRequest(HttpServletRequest request) {

              System.out.println("测试:"+request);

              this.request=request;

       }

       public void setServletContext(ServletContext application) {

              System.out.println("测试:"+application);

              this.application=application;

       }

       ...省略username的get/set方法

}

同样只需要注册此Action并修改登录页面便可发布测试

转载地址:http://qghxa.baihongyu.com/

你可能感兴趣的文章
安装VisualSvn Server时遇到的问题
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
人脸识别 开放书籍 下载地址
查看>>
Notepad++配置Python开发环境
查看>>
用户组概念 和 挂载 概念
查看>>
如何快速获取ADO连接字符串
查看>>
AspNetPager控件的最基本用法
查看>>
sessionKey
查看>>
高性能Javascript--脚本的无阻塞加载策略
查看>>
Java 编程的动态性, 第4部分: 用 Javassist 进行类转换--转载
查看>>
完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
查看>>
iOS8 Push Notifications
查看>>
各大名企笔试及面经大全(程序猿必读)
查看>>
Oracle 连接、会话数的查看,修改
查看>>
Python使用QRCode模块生成二维码
查看>>
英语学习的重要性
查看>>
Android中Handler引起的内存泄露
查看>>
原产地政策,jsonp跨域
查看>>
HDU 1143 Tri Tiling(递归)
查看>>
ffmpeg参数具体解释
查看>>