Struts2学习笔记(四):action中访问request,session以及applicationContext等web资源的方法

在struts2的action中有时会需要访问request,session以及applicationContext等web资源,这里我总结了四种可行的方法,供读者参考。

(1)使用ActionContext

[html]  view plain  copy
  1. <pre name="code" class="java"><pre name="code" class="html">package com.jiajia.actions;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import com.opensymphony.xwork2.ActionContext;  
  6.   
  7. public class TestActionContext {  
  8.   
  9.     public String execute(){  
  10.         //获取actionContext对象  
  11.         ActionContext context = ActionContext.getContext();  
  12.           
  13.         //ActionContext中获取的application是一个Map,里面可以存储需要的参数。  
  14.         Map<String, Object> application = context.getApplication();  
  15.         //在application中放置一个参数applicationAttr  
  16.         application.put("applicationAttr",  
  17.                 "通过ActionContext的getApplication()方法获取application");  
  18.           
  19.         //ActionContext中获取的session也是一个Map  
  20.         Map<String, Object> session = context.getSession();  
  21.         //在session中放置一个参数  
  22.         session.put("sessionAttr",  
  23.                 "通过ActionContext的getSession()方法获取session");  
  24.           
  25.         //ActionContext中获取的request也是一个Map,但获取方法有别于session和application  
  26.         //ActionContext中并没有getRequest()方法(我还不理解为什么会这样)  
  27.         Map<String, Object> request = (Map<String, Object>) context.get("request");  
  28.         //在request中放置一个参数  
  29.         request.put("requestAttr",  
  30.                 "通过ActionContext的get(\"request\")方法获取request");  
  31.           
  32.         return "success";  
  33.     }  
  34. }  


 
 
(2)使用ServletActionContext 

[java]  view plain  copy
  1. <pre name="code" class="java">package com.jiajia.actions;  
  2.   
  3. import javax.servlet.ServletContext;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpSession;  
  6.   
  7. import org.apache.struts2.ServletActionContext;  
  8.   
  9. /** 
  10.  * @author jiajia 
  11.  * 该类主要用来测试通过ServletActionContext类来 
  12.  * 直接获取request、session以及application的方法 
  13.  */  
  14. public class TestServletActionContext {  
  15.   
  16.     public String execute(){  
  17.   
  18.         ServletContext application = ServletActionContext.getServletContext();  
  19.         HttpServletRequest request = ServletActionContext.getRequest();  
  20.         HttpSession session = request.getSession();  
  21.   
  22.         //在application中放置一个参数applicationAttr  
  23.         application.setAttribute("applicationAttr",  
  24.                 "通过ServletActionContext.getServletContext()获取application");  
  25.   
  26.         //在session中放置一个参数  
  27.         session.setAttribute("sessionAttr",  
  28.                 "通过ServletActionContext.getRequest().getSession()获取session");  
  29.   
  30.         //在request中放置一个参数  
  31.         request.setAttribute("requestAttr",  
  32.                 "通过ServletActionContext.getRequest()获取request");  
  33.   
  34.         return "success";  
  35.     }  
  36. }  


 
(3)实现RequestAware, SessionAware, ApplicationAware接口 

[java]  view plain  copy
  1. package com.jiajia.actions;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.apache.struts2.interceptor.ApplicationAware;  
  6. import org.apache.struts2.interceptor.RequestAware;  
  7. import org.apache.struts2.interceptor.SessionAware;  
  8.   
  9. /** 
  10.  * @author jiajia 
  11.  * 该类主要用来测试通过实现RequestAware, SessionAware, ApplicationAware接口,struts会自动向 
  12.  * 对象中注入Map类型的application、session、以及request属性 
  13.  */  
  14. public class TestAware implements RequestAware, SessionAware, ApplicationAware{  
  15.   
  16.     Map<String, Object> application;  
  17.     Map<String, Object> session;  
  18.     Map<String, Object> request;  
  19.   
  20.     @Override  
  21.     public void setApplication(Map<String, Object> arg0) {  
  22.         this.application = arg0;  
  23.     }  
  24.   
  25.     @Override  
  26.     public void setSession(Map<String, Object> arg0) {  
  27.         this.session = arg0;  
  28.     }  
  29.   
  30.     @Override  
  31.     public void setRequest(Map<String, Object> arg0) {  
  32.         this.request = arg0;  
  33.     }  
  34.   
  35.     public String execute(){  
  36.         //在application中放置一个参数applicationAttr  
  37.         application.put("applicationAttr",  
  38.                 "通过实现ApplicationAware接口获取application");  
  39.           
  40.         //在session中放置一个参数  
  41.         session.put("sessionAttr",  
  42.                 "通过实现SessionAware接口获取session");  
  43.           
  44.         //在request中放置一个参数  
  45.         request.put("requestAttr",  
  46.                 "通过实现RequestAware接口获取request");  
  47.   
  48.         return "success";  
  49.     }  
  50.   
  51. }  
(4)实现ServletRequestAware, ServletContextAware接口

[java]  view plain  copy
  1. package com.jiajia.actions;  
  2.   
  3. import javax.servlet.ServletContext;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpSession;  
  6.   
  7. import org.apache.struts2.ServletActionContext;  
  8. import org.apache.struts2.interceptor.ServletRequestAware;  
  9. import org.apache.struts2.util.ServletContextAware;  
  10.   
  11. public class TestServletAware implements ServletRequestAware,  
  12.         ServletContextAware {  
  13.       
  14.     ServletContext application;  
  15.     HttpServletRequest request;  
  16.     HttpSession session;  
  17.   
  18.     @Override  
  19.     public void setServletContext(ServletContext arg0) {  
  20.         this.application = arg0;  
  21.     }  
  22.   
  23.     @Override  
  24.     public void setServletRequest(HttpServletRequest arg0) {  
  25.         this.request = arg0;  
  26.     }  
  27.   
  28.     public String execute(){  
  29.   
  30.         session = request.getSession();  
  31.           
  32.         //在application中放置一个参数applicationAttr  
  33.         application.setAttribute("applicationAttr",  
  34.                 "通过实现ServletContextAware接口获取application");  
  35.   
  36.         //在session中放置一个参数  
  37.         session.setAttribute("sessionAttr",  
  38.                 "通过实现ServletRequestAware接口获取request再调用getSession()获取session");  
  39.         //在request中放置一个参数  
  40.         request.setAttribute("requestAttr",  
  41.                 "通过实现ServletRequestAware接口获取request");  
  42.   
  43.         return "success";  
  44.     }  
  45. }  

上述四种方法中(1)和(3)与原始Servlet API是没有耦合的,但功能也相对较弱,(2)和(4)与原始Servlet API是紧密耦合的,可以提供完整的servlet中的功能

完整示例代码:http://download.csdn.net/detail/jiajia333666/9050793


原博主地址:http://blog.csdn.net/jiajia333666/article/details/48006857


ps:

1.什么是WEB资源?

HttpServletRequest、HttpSession、ServletContext等原生的servlet API


2.为什么访问web资源?

B\S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie, 获取 realPath ....


3. 如何访问 ?

第一种方式: 和 Servlet API 解耦的方式:只能访问有限的 Servlet API 对象,且只能访问其有限的方法(读取请求参数,读写域对象的属性,使session 失效...).

       为了避免与Servlet API 耦合在一起, 方便 Action 做单元测试,Struts2 对 HttpServletRequest, HttpSession 和ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这3 个对象, 在 Action 中可以直接使用HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据.

 

   (1) 使用ActionContext

          ActionContext Action 执行的上下文对象, ActionContext 中保存了 Action 执行所需要的所有对象(可以获得当前Action需要的一切信息),包括 parameters, request,session, application .

          获取HttpSession 对应的 Map 对象:  

          publicMap getSession()

         获取 ServletContext 对应的 Map 对象:

         publicMap getApplication()

         获取请求参数对应的Map 对象:

         publicMap getParameters()

         获取HttpServletRequest 对应的 Map 对象:

         publicObject get(Object key): ActionContext 类中没有提供类似getRequest() 这样的方法来获取 HttpServletRequest 对应的 Map 对象.要得到HttpServletRequest 对应的 Map 对象, 可以通过为get() 方法传递 “request” 参数实现

 

   (2)实现XxxAware 接口

     Action 类通过可以实现某些特定的接口, 让Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和application 对应的 Map 对象:

     选用的建议: 若一个Action 类中有多个 action 方法, 且多个方法都需要使用域对象的Map 或 parameters, 则建议使用Aware 接口的方式

  

       session 对应的 Map 实际上是SessionMap 类型的! 强转后若调用其 invalidate() 方法,可以使其session 失效!

 

第二种方式:和 Servlet API 耦合的方式:可以访问更多的 Servlet API 对象,且可以调用其原生的方法. 

      直接访问Servlet API 将使 Action 与 Servlet 环境耦合在一起,  测试时需要有 Servlet 容器,不便于对Action 的单元测试.

 

   (1)使用ServletActionContext

    直接获取 HttpServletRequest 对象:

    ServletActionContext.getRequest()

     直接获取HttpSession 对象

     ServletActionContext.getRequest().getSession()

     直接获取ServletContext 对象

  ServletActionContext.getServletContext()

 

   (2)实现ServletXxxAware 接口.

      通过实现 ServletRequestAware, ServletContextAware 等接口的方式


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值