什么是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(); } }