ServletActionContext

ActionContext和ServletActionContext

痞子三分冷 提交于 2019-12-04 00:28:11
前面已经了解到ActionContext是Action执行时的上下文,里面存放着Action在执行时需要用到的对象,我们也称之为广义值栈。 Struts2在每次执行Action之前都会创建新的ActionContext,在同一个线程里ActionContext里面的属性是唯一的,这样Action就可以在多线程中使用。 1 :ActionContext 的线程安全性 那么Struts2是如何保证ActionContext的线程安全性呢? 看看ActionContext对象的代码,示例如下: public class ActionContext implements Serializable { static ThreadLocal actionContext = new ThreadLocal(); …… } ThreadLocal又称为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 存放在ActionContext里的数据都存放在这个ThreadLocal的属性中,而这个属性只会在对应的当前请求线程中可见,从而保证数据是线程安全的。 2 :访问的是Map 回顾前面在使用ActionContext来访问Session中数据的程序,你会发现,其实在程序里面访问的是一个Map

Struts2源码阅读之ActionContext

与世无争的帅哥 提交于 2019-12-02 15:58:16
上一篇文章概述了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)