struts2中获取request/session/application

1。访问或添加request/session/application属性

将前一篇文件中的TestAction中的代码修改为如下所示:

Java代码   收藏代码
  1. public class TestAction {  
  2.   
  3.     public String execute() {  
  4.         ActionContext ctx = ActionContext.getContext();  
  5.         ctx.getApplication().put("app""应用范围");// 往ServletContext里放入app  
  6.         ctx.getSession().put("ses""session范围");// 往session里放入ses  
  7.         ctx.put("req""request范围");// 往request里放入req  
  8.         return "success";  
  9.     }  
  10. }  

 result.jsp中的代码修改为:

Java代码   收藏代码
  1. <body>  
  2.     ${applicationScope.app} <br>  
  3.     ${sessionScope.ses}<br>  
  4.     ${requestScope.req}<br>  
  5.  </body>  

 然后访问testAction,reault.jsp页面显示的内容为:

应用范围
session范围
request范围。

在上面的程序中也可以向request/session/application添加集合对象,然后使用jstl标签<c:forEach>在jsp页面迭代,就像使用servlet和jsp编程一样的方式。

 

2。获取HttpServletRequest / HttpSession / ServletContext / HttpServletResponse对象

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

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

Java代码   收藏代码
  1. public class TestAction {  
  2.   
  3.     ActionContext context;  
  4.     Map<String,Object> request;  
  5.     Map<String,Object> session;  
  6.     Map<String,Object> application;  
  7.     @SuppressWarnings("unchecked")  
  8.     public String execute() throws Exception {  
  9.         context=ActionContext.getContext();  
  10.         //request= (Map)context.get("request");  
  11.         session=context.getSession();  
  12.         application=context.getApplication();  
  13.         context.put("req""request范围");// 往request里放入req  
  14.         //request.put("req", "requst属性");//或者使用这种方式  
  15.         session.put("ses""sesion属性");  
  16.         application.put("app""application属性");  
  17.         return "success";  
  18.     }  
  19. }  

  result.jsp中的代码修改为:

Java代码   收藏代码
  1. ${requestScope.req}  
  2. ${sessionScope.ses}  
  3. ${applicationScope.app}  
  4. <h4>以下使用scope.getAttribute的形式来接受</h4>  
  5.         request:    <%=request.getAttribute("req") %><br>  
  6.         session:    <%=session.getAttribute("ses") %><br>  
  7.         application:<%=application.getAttribute("app") %><br>  

 页面访问显示结果为:

Html代码   收藏代码
  1. requst属性 sesion属性 application属性  
  2. 以下使用scope.getAttribute的形式来接受  
  3. request: requst属性  
  4. session: sesion属性  
  5. application:application属性  

 ActionContext中的部分源码如下所示:

Java代码   收藏代码
  1. public class ActionContext  implements Serializable{  
  2. Map<String, Object> context;  
  3.   
  4.     public ActionContext(Map<String, Object> context) {  
  5.         this.context = context;  
  6.     }  
  7.   
  8.     public void setApplication(Map<String, Object> application) {  
  9.         put("com.opensymphony.xwork2.ActionContext.application", application);  
  10.     }  
  11.   
  12.     public Map<String, Object> getApplication() {  
  13.         return ((Map) get("com.opensymphony.xwork2.ActionContext.application"));  
  14.     }  
  15.   
  16.     public void setSession(Map<String, Object> session) {  
  17.         put("com.opensymphony.xwork2.ActionContext.session", session);  
  18.     }  
  19.   
  20.     public Map<String, Object> getSession() {  
  21.         return ((Map) get("com.opensymphony.xwork2.ActionContext.session"));  
  22.     }  
  23.   
  24.     public Object get(String key) {  
  25.         return this.context.get(key);  
  26.     }  
  27. }  

分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在Map中的对象。

 

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

实现指定接口,由struts2框架运行时注入:(在struts2框架运行时会自动注入值)

Java代码   收藏代码
  1. import org.apache.struts2.interceptor.ApplicationAware;  
  2. import org.apache.struts2.interceptor.RequestAware;  
  3. import org.apache.struts2.interceptor.SessionAware;  
  4.   
  5. public class TestAction  implements RequestAware,SessionAware,ApplicationAware {  
  6.     Map<String, Object> request;  
  7.     Map<String, Object> session;  
  8.     Map<String, Object> application;  
  9.     public String execute() throws Exception {  
  10.         request.put("req""requst属性");  
  11.         session.put("ses""sesion属性");  
  12.         application.put("app""application属性");  
  13.         return "success";  
  14.     }  
  15.     public void setRequest(Map<String, Object> request) {  
  16.         System.out.println("request:" + request.getClass().getName());  
  17.         this.request=request;  
  18.     }  
  19.     public void setSession(Map<String, Object> session) {  
  20.         System.out.println("session:" + session.getClass().getName());  
  21.         this.session=session;  
  22.     }  
  23.     public void setApplication(Map<String, Object> application) {  
  24.         System.out.println("application:" + application.getClass().getName());  
  25.         this.application=application;  
  26.     }  
  27. }  

当访问testAction时,控制台打印出的信息如下所示:

Html代码   收藏代码
  1. application:org.apache.struts2.dispatcher.ApplicationMap  
  2. session:org.apache.struts2.dispatcher.SessionMap  
  3. request:org.apache.struts2.dispatcher.RequestMa  

 RequestAware接口的源码如下所示:其他接口的源码类似。

Java代码   收藏代码
  1. public  interface RequestAware  
  2. {  
  3.   public abstract void setRequest(Map<String, Object> paramMap);  
  4. }  

 

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

通过ServletActionContext.类直接获取:

Java代码   收藏代码
  1. public class TestAction {  
  2.     HttpServletRequest request;  
  3.     HttpSession session;  
  4.     ServletContext application;  
  5.   
  6.     public String execute() throws Exception {  
  7.         request = ServletActionContext.getRequest();  
  8.         session = request.getSession();  
  9.         application = ServletActionContext.getServletContext();  
  10.   
  11.         request.setAttribute("req""requst属性");  
  12.         session.setAttribute("ses""sesion属性");  
  13.         application.setAttribute("app""application属性");  
  14.         return "success";  
  15.     }  
  16. }  

 

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

实现指定接口,由struts2框架运行时注入:(在struts2框架运行时会自动注入值)

Java代码   收藏代码
  1. public class TestAction implements ServletRequestAware,ServletResponseAware,ServletContextAware{  
  2.     private ActionContext context;  
  3.     private HttpServletRequest request;  
  4.     private HttpServletResponse response;  
  5.   
  6.     HttpSession session;  
  7.     ServletContext application;  
  8.     public String execute() throws Exception {  
  9.         context=ActionContext.getContext();  
  10.         session=request.getSession();     
  11.         request.setAttribute("req""requst属性");  
  12.         session.setAttribute("ses""sesion属性");  
  13.         application.setAttribute("app""application属性");  
  14.         return "success";  
  15.     }  
  16.       
  17.     public void setServletRequest(HttpServletRequest request) {  
  18.         System.out.println("HttpServletRequest测试:"+request);  
  19.         this.request=request;  
  20.     }  
  21.     public void setServletContext(ServletContext application) {  
  22.         System.out.println("ServletContext测试:"+application);  
  23.         this.application=application;  
  24.     }  
  25.       
  26.     public void setServletResponse(HttpServletResponse response) {  
  27.         System.out.println("HttpServletResponse测试:"+ response);  
  28.         this.response=response;  
  29.     }  
  30. }  

 在访问此action时,控制台打印的信息如下所示:

Html代码   收藏代码
  1. HttpServletRequest测试:org.apache.struts2.dispatcher.StrutsRequestWrapper@1acfa31  
  2. HttpServletResponse测试:org.apache.catalina.connector.ResponseFacade@15dd910  
  3. ServletContext测试:org.apache.catalina.core.ApplicationContextFacade@47a0d4  

  ServletRequestAware的接口源码如下所示:

Java代码   收藏代码
  1. public  interface ServletRequestAware  
  2. {  
  3.   public abstract void setServletRequest(HttpServletRequest paramHttpServletRequest);  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值