通过上一篇,对Struts2有了一个基本的认识,并成功的运行了基于Struts2的第一个web项目。在讲解配置文件之前,先来看一下这些配置文件的加载顺序。
客户端的每次请求到服务器都要先经过Struts2的核心过滤器StrutsPrepareAndExecuteFilter
,主要负责请求预处理和执行。
在预处理中主要是来加载配置文件,对应着源码中的init
方法。而执行主要通过拦截器完成部分功能,对应着过滤器的doFilter
方法。
预处理
首先,从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
方法中调用了initDispatcher
方法来加载配置文件,方法如下:
public Dispatcher initDispatcher(HostConfig filterConfig) {
Dispatcher dispatcher = this.createDispatcher(filterConfig);
dispatcher.init();
return dispatcher;
}
在initDispatcher
中,又调用了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();
// 加载用户配置的provider(提供对象)
this.init_CustomConfigurationProviders();
// 加载web.xml文件
this.init_FilterInitParameters();
// 加载标准对象
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);
}
}
通过源码分析,可以看到配置文件的加在顺序如下:
default.properties
struts-default.xml
struts-plugin.xml
struts.xml // 配置Action以及常量
struts.properties // 配置常量
web.xml // 配置核心过滤器及常量
前三个为Struts2内部配置文件,无法对其修改,我们所需要关注的是struts.xml
、struts.properties
、web.xml
三个文件。
因为这几个文件加载是有顺序的,后三个配置文件都可以修改Struts2常量值,需要注意的是,后者会覆盖前者。