通過(guò)上一篇,對(duì)Struts2有了一個(gè)基本的認(rèn)識(shí),并成功的運(yùn)行了基于Struts2的第一個(gè)web項(xiàng)目。在講解配置文件之前,先來(lái)看一下這些配置文件的加載順序。
客戶(hù)端的每次請(qǐng)求到服務(wù)器都要先經(jīng)過(guò)Struts2的核心過(guò)濾器StrutsPrepareAndExecuteFilter,主要負(fù)責(zé)請(qǐng)求預(yù)處理和執(zhí)行。
在預(yù)處理中主要是來(lái)加載配置文件,對(duì)應(yīng)著源碼中的init方法。而執(zhí)行主要通過(guò)攔截器完成部分功能,對(duì)應(yīng)著過(guò)濾器的doFilter方法。
預(yù)處理
首先,從web.xml中配置的StrutsPrepareAndExecuterFilter的init方法看起,方法如下:
public void init(FilterConfig filterConfig) throws ServletException {
InitOperations init = new InitOperations();
Dispatcher dispatcher = null;
try {
FilterHostConfig config = new FilterHostConfig(filterConfig);
init.initLogging(config);
dispatcher = init.initDispatcher(config);
init.initStaticContentLoader(config, dispatcher);
this.prepare = new PrepareOperations(dispatcher);
this.execute = new ExecuteOperations(dispatcher);
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
this.postInit(dispatcher, filterConfig);
} finally {
if(dispatcher != null) {
dispatcher.cleanUpAfterInit();
}
init.cleanup();
}
}
在init方法中調(diào)用了initDispatcher方法來(lái)加載配置文件,方法如下:
public Dispatcher initDispatcher(HostConfig filterConfig) {
Dispatcher dispatcher = this.createDispatcher(filterConfig);
dispatcher.init();
return dispatcher;
}
在initDispatcher中,又調(diào)用了dispatcher.init()方法,這里面真正做了Struts2配置文件的加載,如下:
public void init() {
if(this.configurationManager == null) {
this.configurationManager = this.createConfigurationManager("struts");
}
try {
this.init_FileManager();
// 加載`org.apache.struts/default.properties`配置中常量
this.init_DefaultProperties();
// 加載struts-default.xml、struts-plugin.xml、struts.xml
this.init_TraditionalXmlConfigurations();
// 加載自定義的struts.properties
this.init_LegacyStrutsProperties();
// 加載用戶(hù)配置的provider(提供對(duì)象)
this.init_CustomConfigurationProviders();
// 加載web.xml文件
this.init_FilterInitParameters();
// 加載標(biāo)準(zhǔn)對(duì)象
this.init_AliasStandardObjects();
Container ex = this.init_PreloadConfiguration();
ex.inject(this);
this.init_CheckWebLogicWorkaround(ex);
if(!dispatcherListeners.isEmpty()) {
Iterator i$ = dispatcherListeners.iterator();
while(i$.hasNext()) {
DispatcherListener l = (DispatcherListener)i$.next();
l.dispatcherInitialized(this);
}
}
this.errorHandler.init(this.servletContext);
} catch (Exception var4) {
if(LOG.isErrorEnabled()) {
LOG.error("Dispatcher initialization failed", var4, new String[0]);
}
throw new StrutsException(var4);
}
}
通過(guò)源碼分析,可以看到配置文件的加在順序如下:
default.properties
struts-default.xml
struts-plugin.xml
struts.xml // 配置Action以及常量
struts.properties // 配置常量
web.xml // 配置核心過(guò)濾器及常量
前三個(gè)為Struts2內(nèi)部配置文件,無(wú)法對(duì)其修改,我們所需要關(guān)注的是struts.xml、struts.properties、web.xml三個(gè)文件。
因?yàn)檫@幾個(gè)文件加載是有順序的,后三個(gè)配置文件都可以修改Struts2常量值,需要注意的是,后者會(huì)覆蓋前者。