1 原理
三个域合一的时候相同的键值对以小的域为准。
ActionContext 对象创建:每次请求的时候都会创建一个与请求对应的 ActionContext 对象。
ActionContext 销毁:请求处理完 ActionContext 销毁。
ActionContext 的生命周期由其中生命周期最短的 request 域限制了。
问题 1:application 不应该是一个项目种只有一个吗?你每次请求都会创建 application 域
吗?
答:ActionContext 不能反过来影响其它域的生命周期。ActionContext 每次的创建只是负
责把以前那些域收集过来,然后销毁的时候只是仅仅销毁 ActionContext,并没有销毁掉
ActionContext 域。域还是以前的域,下次创建 ActionContext 对象的时候,再把
ActionContext 域取出来,然后收录进来。
问题 2:项目种可能同时存在多个 ActionContext 对象吗?
答:对。一个请求创建一个,如果是 10 个请求,就会创建 10 个 ActionContext 对象。
问题 3:如何获得当前请求的 ActionContext 对象?
答:struts2 设计的是,将 ActionContext 对象创建好后,将 ActionContext 与当前线程绑
定。我们要获得 ActionContext 对象,只需要从 ThreadLocal 获取即可。
2 通过 ActionContext
package www.test.b_api; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; //如何在action中获取原生的serveltAPI public class Demo5Action extends ActionSupport { public String execute() throws Exception { //request域===>Map (Struts2并不推荐使用原生的request域) //不推荐 Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request"); //推荐 ActionContext.getContext().put("name", "ActionContextTom"); //获得session域==>Map Map<String, Object> sessionScope = ActionContext.getContext().getSession(); sessionScope.put("name", "sessionTom"); //获得application域===>Map Map<String, Object> applicationScope = ActionContext.getContext().getApplication(); applicationScope.put("name", "applicationTom"); return SUCCESS; } }
3 通过 ServletActionContext
package www.test.b_api; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; //如何在action中获得原生ServletAPI public class Demo6Action extends ActionSupport { //并不推荐 public String execute() throws Exception { //获得原生的request HttpServletRequest request = ServletActionContext.getRequest(); //原生的session HttpSession session = request.getSession(); //原生的application ServletContext servletContext = ServletActionContext.getServletContext(); return SUCCESS; } }
4 通过实现接口方式
package www.test.b_api; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class Demo7Action extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; @Override public String execute() throws Exception { System.out.println("原生的request:"+request); request.setAttribute("name", "zhagnsan"); return SUCCESS; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }