这个ActionContext存储了一些与当前Action相关的信息。
其实从上一步我们就不难看出struts2为每一个Action创建一个线程,这也体现了struts2相比于struts1的优势:线程安全,因为每一个Action都由一个单独的线程来负责,不存在共享数据,所以安全。我们进入PrepareOperations类的assignDispatcherToThread()方法的源码看一下:
public void assignDispatcherToThread() {
// 将当前的这个dispatcher实例化
Dispatcher.setInstance(dispatcher);
}
再进入Dispatcher的setInstance方法中看一下:
public static void setInstance(Dispatcher instance) {
// 调用了这个Dispatcher的instance属性的set方法
// ps:这个instance是一个ThreadLocal对象
Dispatcher.instance.set(instance);
}
再进入set方法中看一下:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
终于找到根源了,获取到当前的线程,把dispatcher放入当前线程中。那么这个Dispatcher有什么作用呢?看一下源码,这个源码有点多,就摘抄一个重要的方法来看下吧:
/**
* 初始化一系列的配置文件:default.properties, struts-default.xml, struts.properties, struts.xml...文件,并且是按顺序加载
*/
public void init() {
if (configurationManager == null) {
configurationManager = createConfigurationManager(DefaultBeanSelectionProvider.DEFAULT_BEAN_NAME);
}
try {
init_FileManager();
init_DefaultProperties(); // [1]default.properties
init_TraditionalXmlConfigurations(); // [2]struts-default.xml...
init_LegacyStrutsProperties(); // [3]struts.properties
init_CustomConfigurationProviders(); // [5]struts.xml
init_FilterInitParameters() ; // [6]初始化过滤器配置的参数
init_AliasStandardObjects() ; // [7]别名什么的..这里就不深究了
Container container = init_PreloadConfiguration();
container.inject(this);
init_CheckWebLogicWorkaround(container);
if (!dispatcherListeners.isEmpty()) {
for (DispatcherListener l : dispatcherListeners) {
l.dispatcherInitialized(this);
}
}
} catch (Exception ex) {
if (LOG.isErrorEnabled())
LOG.error("Dispatcher initialization failed", ex);
throw new StrutsException(ex);
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-78438-6.html
我们这些老家伙积累点钱防老