这个filter是struts中最重要的filter,主要完成以下四个功能:
1、处理action
2、清理ActionContext
3、处理静态资源
4、触发指定请求生命周期内的拦截器链
这个filter是武断性的,也就是说它通过ActonMapper来寻找特定的action,如果找到了,那么其他剩下的filter就不会再被引用,转而去处理action,这意味着其他过滤器需要放置到这个filter前面,否则将不会被引用到。
- public void setDevMode(String mode) {
- devMode = "true".equals(mode);
- }
public void setDevMode(String mode) {
devMode = "true".equals(mode);
}
这样的set方法还是值得我们借鉴的。
- public void init(FilterConfig filterConfig) throws ServletException {
- try {
- this.filterConfig = filterConfig;
- initLogging();
- dispatcher = createDispatcher(filterConfig);
- dispatcher.init();
- dispatcher.getContainer().inject(this);
- staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig));
- } finally {
- ActionContext.setContext(null);
- }
- }
public void init(FilterConfig filterConfig) throws ServletException {
try {
this.filterConfig = filterConfig;
initLogging();
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
dispatcher.getContainer().inject(this);
staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig));
} finally {
ActionContext.setContext(null);
}
}
在初始化方法中,会初始化log,创建调度者,并对静态资源做一些处理。
初始化log
- private void initLogging() {
- //查看web.xml中filter的初始化参数中有无配置loggerFactory
- String factoryName = filterConfig.getInitParameter("loggerFactory");
- if (factoryName != null) {
- try {
- Class cls = ClassLoaderUtils.loadClass(factoryName, this.getClass());
- LoggerFactory fac = (LoggerFactory) cls.newInstance();
- LoggerFactory.setLoggerFactory(fac);
- } catch (InstantiationException e) {
- System.err.println("Unable to instantiate logger factory: " + factoryName + ", using default");
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- System.err.println("Unable to access logger factory: " + factoryName + ", using default");
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- System.err.println("Unable to locate logger factory class: " + factoryName + ", using default");
- e.printStackTrace();
- }
- }
- log = LoggerFactory.getLogger(FilterDispatcher.class);
- }
private void initLogging() {
//查看web.xml中filter的初始化参数中有无配置loggerFactory
String factoryName = filterConfig.getInitParameter("loggerFactory");
if (factoryName != null) {
try {
Class cls = ClassLoaderUtils.loadClass(factoryName, this.getClass());
LoggerFactory fac = (LoggerFactory) cls.newInstance();
LoggerFactory.setLoggerFactory(fac);
} catch (InstantiationException e) {
System.err.println("Unable to instantiate logger factory: " + factoryName + ", using default");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.err.println("Unable to access logger factory: " + factoryName + ", using default");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.err.println("Unable to locate logger factory class: " + factoryName + ", using default");
e.printStackTrace();
}
}
log = LoggerFactory.getLogger(FilterDispatcher.class);
}
接下来,是初始化dispatcher的方法
- /**
- *加载配置文件,包括xml和一些默认的配置,
- *更新一些配置,包括是否重新加载一些配置或资源.
- */
- public void init() {
- //struts.xml是配置文件的入口
- if (configurationManager == null) {
- configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
- }
- //初始化配置,添加到configurationManager#containerProviders List中
- try {
- //加载org/apache/struts2/default.properties struts常量
- init_DefaultProperties(); // [1]
- //web.xml中的config
- //若没有则加载struts-default.xml,struts-plugin.xml,struts.xml
- init_TraditionalXmlConfigurations(); // [2]
- init_LegacyStrutsProperties(); // [3]
- //用户自定义的ConfigurationProvider web.xml 中 configProviders
- init_CustomConfigurationProviders(); // [5]
- //web.xml中配置的init-param参数
- init_FilterInitParameters() ; // [6]
- //根据我们在struts.xml中配置的常量,初始化一些插件类
- //比如我们设置的devmode
- init_AliasStandardObjects() ; // [7]
- Container container = init_PreloadConfiguration();
- container.inject(this);
- init_CheckConfigurationReloading(container);
- 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);
- }
- }
/**
*加载配置文件,包括xml和一些默认的配置,
*更新一些配置,包括是否重新加载一些配置或资源.
*/
public void init() {
//struts.xml是配置文件的入口
if (configurationManager == null) {
configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
}
//初始化配置,添加到configurationManager#containerProviders List中
try {
//加载org/apache/struts2/default.properties struts常量
init_DefaultProperties(); // [1]
//web.xml中的config
//若没有则加载struts-default.xml,struts-plugin.xml,struts.xml
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
//用户自定义的ConfigurationProvider web.xml 中 configProviders
init_CustomConfigurationProviders(); // [5]
//web.xml中配置的init-param参数
init_FilterInitParameters() ; // [6]
//根据我们在struts.xml中配置的常量,初始化一些插件类
//比如我们设置的devmode
init_AliasStandardObjects() ; // [7]
Container container = init_PreloadConfiguration();
container.inject(this);
init_CheckConfigurationReloading(container);
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);
}
}
Container container = init_PreloadConfiguration