struts2中获得request response session等内置对象的方法

在我们熟知的struts操作中,无论是通过servlet中request获得传递的参数,设置编码方法,forward,redirect还是session的Attribute和response的输出过程,均通过配置和封装实现了与Servlet Api的解耦,让我们再开发中极大方便地个性化操作,但如果我们有特殊需要想要获得这些对象呢?

1.与Servlet解耦方式

1)IOC方式

这种方式主要用于action中,采用容器注入的方法得到对象

 1 public class RegisterAction extends ActionSupport   implements HttpServletRequest,HttpServletResponse,SessionAware,ApplicationAware{  
 2      private Map<String,Object> request;//依赖注入,控制反转  
 3     private Map<String,Object> session;  
 4     private Map<String,Object> application;  
 5    
 6     public voidsetApplication(Map<String, Object> arg0) {  
 7        this.application = arg0;  
 8     }  
 9     public voidsetSession(Map<String, Object> arg0) {  
10        this.session = arg0;  
11     }  
12     public voidsetRequest(Map<String, Object> arg0) {  
13        this.request = arg0;  
14     }  
15     request.put("r1","r1");  
16     session.put("i1","i1");  
17     application.put("a1","a1");  
18     return SUCCESS;  
19 }  

若要注入某种对象,就要实现对应的Aware接口

2)非IOC方式

这种方式要使用到的一个类是ActionContext,ActionContext是指Action的上下文相当于一个容器(Map),里面保存了每次请求的信息 request response  session servletContext params local(本地信息),这些信息均以键值对的方式保存。ActionContext只在一次请求中建立一次,且提供的静态方法保证线程安全,在filter建立和初始化的时候这些信息均为空。而且ActionContext可以在action之外的类中使用,可以在Action与action之间,和jsp之间传递信息。下面看获得信息的代码:

 1 Action代码  
 2     //private ActionContext context ;//该方法还可以取得值栈(getValueStack()),使用push(obj)往值栈中放数据    
 3     private Map request;  
 4     private Map session ;    
 5     private Map application ;  
 6      
 7     public LoginAction1(){  
 8        request = (Map)ActionContext.getContext().get("request");   //获取request  
 9        session = ActionContext.getContext().getSession();          //取得session  
10        application = ActionContext.getContext().getApplication();   //取得application  
11         
12        request.put("r1","r1");  
13        session.put("i1","i1");  
14        application.put("a1","a1");  
15        return SUCCESS;  
16     }  
17 JSP代码  
18    <s:property value="#request.r1" />|<%=request.getAttribute("r1") %><br>  
19    <s:property value="#session.i1" />|<%=session.getAttribute("i1") %><br>  
20    <s:property value="#application.a1" />|<%=application.getAttribute("a1") %><br>  
21 <s:debug></s:debug>  

这里的request session application和servlet中的概念不同,他们均是封装过的Map类型,与servlet中的同名内置对象相对应。

2.与servlet耦合的方式

 1 public class LoginAction3 extends ActionSupport{  
 2   
 3     private HttpServletRequest request;  
 4     private HttpSession session;  
 5     private ServletContext application;  
 6     public LoginAction3(){  
 7         request = ServletActionContext.getRequest();  
 8         session = request.getSession();  
 9         application = session.getServletContext();  
10 }  

这种方式和servlet发生耦合,理论上与开发思想相悖,但用起来很方便。

 

个人倾向于第二种方法,非Ioc且与Servlet解耦的方式,IOC方式要实现接口并靠容器注入总感觉不放心,哈哈,因为不太了解Aeare接口而且要实现的代码多。

posted on 2017-06-22 17:06  繁花烈火  阅读(108)  评论(0)    收藏  举报