Struts2在Action中访问WEB资源
2015-11-17 23:29
225 查看
什么是WEB资源?
这里所说的WEB资源是指:HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。为什么需要访问WEB资源?
B/S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie等等操作均需要用到上述原生的ServletAPI访问方法
和 Servlet API 解耦的方式:
只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).> 使用 ActionContext
使用示例:public class ActionTest { @SuppressWarnings("unchecked") public String execute() { // 0、获取ActionContext对象 // ActionContext是Action的上下文,可以从中获取到当前Action需要的相关信息 ActionContext context = ActionContext.getContext(); // 1、获取application域对应的Map对象 // 通过调用上下文对象context的getApplication()方法获取 Map<String, Object> applicationMap = context.getApplication(); applicationMap.put("applicationKey", "applicationValue"); // 2、session Map<String, Object> sessionMap = context.getSession(); sessionMap.put("sessionKey", "sessionValue"); // 3、request // ActionContext中并没有提供获取getRequest方法来获取requestMap的方法 // 而是需要调用get方法,并且传入‘request’字符串作为参数来获取 Map<String, Object> requestMap = (Map<String, Object>) context.get("request"); requestMap.put("requestKey", "requestValue"); // 4、获取请求参数对应的map // 键:请求参数名,值:请求参数的值对应的字符串数组 Map<String, Object> parameters = context.getParameters(); System.out.println(((String[]) parameters.get("name"))[0]); return null; } }
> 实现 XxxAware 接口
使用示例:public class ActionAwareTest implements ApplicationAware, SessionAware, RequestAware, ParameterAware { private Map<String, Object> applicationMap; private Map<String, Object> sessionMap; private Map<String, Object> requestMap; private Map<String, String[]> parameters; @Override public void setApplication(Map<String, Object> map) { this.applicationMap = map; } @Override public void setSession(Map<String, Object> map) { this.sessionMap = map; } @Override public void setRequest(Map<String, Object> map) { this.requestMap = map; } @Override public void setParameters(Map<String, String[]> map) { this.parameters = map; } public String execute() { return null; } }
> 选用的建议:
若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用 Aware 接口的方式session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!
和 Servlet API 耦合的方式:
可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.> 使用 ServletActionContext
获取方法:/** * ServletActionContext 可以从中获取到一切Servlet API相关的方法 * @author Administrator * */ public class ServletActionContextTest { public String execute(){ //获取原生request对象 HttpServletRequest request=ServletActionContext.getRequest(); //获取原生session对象 HttpSession session=request.getSession(); //获取原生application对象 ServletContext application=ServletActionContext.getServletContext(); return null; } }
> 实现 ServletXxxAware 接口.
获取方法:/** * 通过实现ServletXxxAware接口的方式由Struts2负责注入相关对象 * ServletRequestAware:用来注入request对象 * ServletContextAware:用来注入application对象 * @author Administrator * */ public class ServletAwareActionTest implements ServletRequestAware, ServletContextAware { private HttpServletRequest request; private ServletContext application; private HttpSession session; @Override public void setServletContext(ServletContext servletContext) { this.application = servletContext; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; this.session = request.getSession(); } }
相关文章推荐
- struts2中struts.xml和web.xml文件解析及工作原理
- [转][Java]使用Spring配合Junit进行单元测试的总结
- Java类加载器深入探索
- java 输入输出流详解
- Java基础部分
- Java内存模型以及Volatile、Synchronize关键字的疑问
- Java装箱和拆箱的基本概念及使用
- java实现属性转换json数据
- java设计模式--两种单例模式实现
- 接口与回调
- Java位运算符
- 服务端调用js:javax.script
- Java垃圾回收机制
- 第一次spring冲刺第6天
- Java Collection
- 对象克隆+深浅拷贝
- javamail的一些小bug
- 深入解析java虚拟机-jvm运行机制
- 用java解析xml
- JAVA中String字符串的各种基本操作