1 Struts2执行流程
当用户访问某一个Action的时候,先经过核心过滤器(web.xml中配置),在核心过滤器中执行一组拦截器(这组拦截器实现部分功能,在Struts2的核心包中的Struts-default.xml文件中),执行目标Action,根据Action的返回值,进行页面跳转。
2 Struts2配置文件加载顺序
服务器一启动,核心过滤器就加载
1>打开StrutsPrepareAndExecuteFilter的源码,查看其初始化方法;其中有一行代码:dispatcher = init.initDispatcher(config);
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);
prepare = new PrepareOperations(dispatcher);
execute = new ExecuteOperations(dispatcher);
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
postInit(dispatcher, filterConfig);
} finally {
if (dispatcher != null) {
dispatcher.cleanUpAfterInit();
}
init.cleanup();
}
}
2> 查看init.initDispatcher(config)方法,代码如下;
public Dispatcher initDispatcher( HostConfig filterConfig ) {
Dispatcher dispatcher = createDispatcher(filterConfig);
dispatcher.init();
return dispatcher;
}
3>在查看它的初始化方法:
public void init() {
if (configurationManager == null) {
configurationManager = createConfigurationManager(DefaultBeanSelectionProvider.DEFAULT_BEAN_NAME);
}
try {
init_FileManager();
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_CustomConfigurationProviders(); // [5]
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);
}
}
errorHandler.init(servletContext);
} catch (Exception ex) {
if (LOG.isErrorEnabled())
LOG.error("Dispatcher initialization failed", ex);
throw new StrutsException(ex);
}
}
- init_DefaultProperties() ----加载default.properties(在Struts2中不需要管post请求的中文乱码)
- init_TraditionalXmlConfigurations(); ----加载struts-default.xml、struts-plugin.xml(一些插件的配置文件)、struts.xml
- init_LegacyStrutsProperties(); ----加载struts.properties(用户可以自己定义的文件)
- init_CustomConfigurationProviders(); ----加载配置提供类
- init_FilterInitParameters() ; // [6] ----加载web.xml中过滤器初始化参数
- init_AliasStandardObjects() ; // [7] ----加载Bean对象
因此其加载顺序为:
- default.properties
- struts-default.xml
- struts-plugin.xml
- struts.xml
- struts.properties
- web.xml
注意:后配置的常量的值会覆盖先配置的常量的值