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