上一篇文章概述了Struts2的一些流程。这次说下ActionContext,直接进入正题。
static ThreadLocal actionContext = new ThreadLocal();//ActionContext
public static ActionContext getContext() {
return (ActionContext) actionContext.get();
}
从上面可以看到ActionContext是被存放在当前线程中的,获取ActionContext也是从ThreadLocal中获取的。因此在执行拦截器、 action和result的过程中,由于他们都是在一个线程中按照顺序执行的,所以可以在任意时候从ThreadLocal中获取 ActionContext。
ActionContext是Action执行时的上下文,上下文可以看作是一个容器
Map<String, Object> context;
public static void setContext(ActionContext context) {
actionContext.set(context);
}
public static ActionContext getContext() {
return (ActionContext) actionContext.get();
}
由上面可以看出,其实我们这里的容器就是一个Map而已,在容器中存放的是Action在执行时需要用到的对象.比如:VALUE_STACK、ACTION_NAME、SESSION、APPLICATION、ACTION_INVOCATION等等。
另外还一个类叫ServletActionContext,它直接继承了ActionContext,因此也是线程安全的。ServletActionContext还提供了一些直接与Servlet相关对象访问的功能,例如HttpServletRequest、HttpServletResponse、ServletContext、PageContextd等。
如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.
来源:oschina
链接:https://my.oschina.net/u/698737/blog/89878