struts2在Action中获取Scope中的对象request、session、application

来源:互联网 发布:域名邮箱怎么设置 编辑:程序博客网 时间:2024/04/29 16:07

一、描述

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

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

获取的scope对象与容器无关,通过ActionContext获取。
LoginAction代码如下

package com.asm;

public class LoginAction extends ActionSupport {

    private Stringusername;

    ActionContext context;

    Map request;

    Map session;

    Map application;

    public String execute()throwsException {

       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属性");

       returnSUCCESS;

    }

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

}

struts.xml配置如下:

<struts>

    <packagename="scope"extends="struts-default">

       <actionname="login"class="com.asm.LoginAction">

           <result>/loginSuc.jsp</result>

</action>
</
package>   

</struts>

login.jsp内容如下:

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

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

       <inputtype="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 ActionSupportimplementsRequestAware,SessionAware,ApplicationAware {

    private Stringusername;

    Map request;

    Map session;

    Map application;

    public String execute()throws Exception {

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

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

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

       returnSUCCESS;

    }

    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赋值,但是在方式二中它是通过实现接口,在重写接口中的方法中完成对Maprequset的赋值,所以称之IOC方式。借助此例,略谈下依赖注入与控制反转:所谓依赖注入就是一个对象自己本身的初始化是依赖其它对象。比如这里Map request这些对象会依赖struts2来给其初始化,称为依赖注入,而依赖注入的就表示,这些对象的控制权不再由此类本身掌握,而是交给了别的对象,即是控制权反转了。强调:方式二是开发中主要用的方式,应重点掌握


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

建立Login3Action,代码如下:
package com.asm;
public class Login3Actionextends ActionSupport {

    private Stringusername;

    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属性");

       returnSUCCESS;

    }

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

}
此方法获取的纯粹的Scope对象,它与容器相关,这些Scope对象操作更强。


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

建立Login4Action,代码如下:

package com.asm;
public class Login4Actionextends ActionSupportimplementsServletRequestAware,ServletContextAware{

    private Stringusername;

    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属性");

       returnSUCCESS;

    }

   

    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方法

}

0 0
原创粉丝点击