struts2源码学习一 FilterDispatcher

 这个filter是struts中最重要的filter,主要完成以下四个功能:

1、处理action
2、清理ActionContext
3、处理静态资源
4、触发指定请求生命周期内的拦截器链

这个filter是武断性的,也就是说它通过ActonMapper来寻找特定的action,如果找到了,那么其他剩下的filter就不会再被引用,转而去处理action,这意味着其他过滤器需要放置到这个filter前面,否则将不会被引用到。
Java代码 复制代码 收藏代码
  1. public void setDevMode(String mode) {
  2. devMode = "true".equals(mode);
  3. }
 public void setDevMode(String mode) {
        devMode = "true".equals(mode);
}
这样的set方法还是值得我们借鉴的。
Java代码 复制代码 收藏代码
  1. public void init(FilterConfig filterConfig) throws ServletException {
  2. try {
  3. this.filterConfig = filterConfig;
  4. initLogging();
  5. dispatcher = createDispatcher(filterConfig);
  6. dispatcher.init();
  7. dispatcher.getContainer().inject(this);
  8. staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig));
  9. } finally {
  10. ActionContext.setContext(null);
  11. }
  12. }
 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
Java代码 复制代码 收藏代码
  1. private void initLogging() {
  2. //查看web.xml中filter的初始化参数中有无配置loggerFactory
  3. String factoryName = filterConfig.getInitParameter("loggerFactory");
  4. if (factoryName != null) {
  5. try {
  6. Class cls = ClassLoaderUtils.loadClass(factoryName, this.getClass());
  7. LoggerFactory fac = (LoggerFactory) cls.newInstance();
  8. LoggerFactory.setLoggerFactory(fac);
  9. } catch (InstantiationException e) {
  10. System.err.println("Unable to instantiate logger factory: " + factoryName + ", using default");
  11. e.printStackTrace();
  12. } catch (IllegalAccessException e) {
  13. System.err.println("Unable to access logger factory: " + factoryName + ", using default");
  14. e.printStackTrace();
  15. } catch (ClassNotFoundException e) {
  16. System.err.println("Unable to locate logger factory class: " + factoryName + ", using default");
  17. e.printStackTrace();
  18. }
  19. }
  20. log = LoggerFactory.getLogger(FilterDispatcher.class);
  21. }
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的方法
Java代码 复制代码 收藏代码
  1. /**
  2. *加载配置文件,包括xml和一些默认的配置,
  3. *更新一些配置,包括是否重新加载一些配置或资源.
  4. */
  5. public void init() {
  6. //struts.xml是配置文件的入口
  7. if (configurationManager == null) {
  8. configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
  9. }
  10. //初始化配置,添加到configurationManager#containerProviders List中
  11. try {
  12. //加载org/apache/struts2/default.properties struts常量
  13. init_DefaultProperties(); // [1]
  14. //web.xml中的config
  15. //若没有则加载struts-default.xml,struts-plugin.xml,struts.xml
  16. init_TraditionalXmlConfigurations(); // [2]
  17. init_LegacyStrutsProperties(); // [3]
  18. //用户自定义的ConfigurationProvider web.xml 中 configProviders
  19. init_CustomConfigurationProviders(); // [5]
  20. //web.xml中配置的init-param参数
  21. init_FilterInitParameters() ; // [6]
  22. //根据我们在struts.xml中配置的常量,初始化一些插件类
  23. //比如我们设置的devmode
  24. init_AliasStandardObjects() ; // [7]
  25. Container container = init_PreloadConfiguration();
  26. container.inject(this);
  27. init_CheckConfigurationReloading(container);
  28. init_CheckWebLogicWorkaround(container);
  29. if (!dispatcherListeners.isEmpty()) {
  30. for (DispatcherListener l : dispatcherListeners) {
  31. l.dispatcherInitialized(this);
  32. }
  33. }
  34. } catch (Exception ex) {
  35. if (LOG.isErrorEnabled())
  36. LOG.error("Dispatcher initialization failed", ex);
  37. throw new StrutsException(ex);
  38. }
  39. }
/**
     *加载配置文件,包括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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值