在struts2的action中有时会需要访问request,session以及applicationContext等web资源,这里我总结了四种可行的方法,供读者参考。
(1)使用ActionContext
- <pre name="code" class="java"><pre name="code" class="html">package com.jiajia.actions;
-
- import java.util.Map;
-
- import com.opensymphony.xwork2.ActionContext;
-
- public class TestActionContext {
-
- public String execute(){
- //获取actionContext对象
- ActionContext context = ActionContext.getContext();
-
- //ActionContext中获取的application是一个Map,里面可以存储需要的参数。
- Map<String, Object> application = context.getApplication();
- //在application中放置一个参数applicationAttr
- application.put("applicationAttr",
- "通过ActionContext的getApplication()方法获取application");
-
- //ActionContext中获取的session也是一个Map
- Map<String, Object> session = context.getSession();
- //在session中放置一个参数
- session.put("sessionAttr",
- "通过ActionContext的getSession()方法获取session");
-
- //ActionContext中获取的request也是一个Map,但获取方法有别于session和application
- //ActionContext中并没有getRequest()方法(我还不理解为什么会这样)
- Map<String, Object> request = (Map<String, Object>) context.get("request");
- //在request中放置一个参数
- request.put("requestAttr",
- "通过ActionContext的get(\"request\")方法获取request");
-
- return "success";
- }
- }
(2)使用ServletActionContext
- <pre name="code" class="java">package com.jiajia.actions;
-
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
-
- import org.apache.struts2.ServletActionContext;
-
-
-
-
-
-
- public class TestServletActionContext {
-
- public String execute(){
-
- ServletContext application = ServletActionContext.getServletContext();
- HttpServletRequest request = ServletActionContext.getRequest();
- HttpSession session = request.getSession();
-
-
- application.setAttribute("applicationAttr",
- "通过ServletActionContext.getServletContext()获取application");
-
-
- session.setAttribute("sessionAttr",
- "通过ServletActionContext.getRequest().getSession()获取session");
-
-
- request.setAttribute("requestAttr",
- "通过ServletActionContext.getRequest()获取request");
-
- return "success";
- }
- }
(3)实现RequestAware, SessionAware, ApplicationAware接口
- package com.jiajia.actions;
-
- import java.util.Map;
-
- import org.apache.struts2.interceptor.ApplicationAware;
- import org.apache.struts2.interceptor.RequestAware;
- import org.apache.struts2.interceptor.SessionAware;
-
-
-
-
-
-
- public class TestAware implements RequestAware, SessionAware, ApplicationAware{
-
- Map<String, Object> application;
- Map<String, Object> session;
- Map<String, Object> request;
-
- @Override
- public void setApplication(Map<String, Object> arg0) {
- this.application = arg0;
- }
-
- @Override
- public void setSession(Map<String, Object> arg0) {
- this.session = arg0;
- }
-
- @Override
- public void setRequest(Map<String, Object> arg0) {
- this.request = arg0;
- }
-
- public String execute(){
-
- application.put("applicationAttr",
- "通过实现ApplicationAware接口获取application");
-
-
- session.put("sessionAttr",
- "通过实现SessionAware接口获取session");
-
-
- request.put("requestAttr",
- "通过实现RequestAware接口获取request");
-
- return "success";
- }
-
- }
(4)实现ServletRequestAware, ServletContextAware接口
- package com.jiajia.actions;
-
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
-
- import org.apache.struts2.ServletActionContext;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import org.apache.struts2.util.ServletContextAware;
-
- public class TestServletAware implements ServletRequestAware,
- ServletContextAware {
-
- ServletContext application;
- HttpServletRequest request;
- HttpSession session;
-
- @Override
- public void setServletContext(ServletContext arg0) {
- this.application = arg0;
- }
-
- @Override
- public void setServletRequest(HttpServletRequest arg0) {
- this.request = arg0;
- }
-
- public String execute(){
-
- session = request.getSession();
-
-
- application.setAttribute("applicationAttr",
- "通过实现ServletContextAware接口获取application");
-
-
- session.setAttribute("sessionAttr",
- "通过实现ServletRequestAware接口获取request再调用getSession()获取session");
-
- request.setAttribute("requestAttr",
- "通过实现ServletRequestAware接口获取request");
-
- return "success";
- }
- }
上述四种方法中(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 等接口的方式