Struts2执行流程及配置文件加载顺序

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);
        }
    }
  1. init_DefaultProperties()                            ----加载default.properties(在Struts2中不需要管post请求的中文乱码)
  2. init_TraditionalXmlConfigurations();         ----加载struts-default.xml、struts-plugin.xml(一些插件的配置文件)、struts.xml
  3. init_LegacyStrutsProperties();                 ----加载struts.properties(用户可以自己定义的文件
  4. init_CustomConfigurationProviders();      ----加载配置提供类
  5. init_FilterInitParameters() ; // [6]              ----加载web.xml中过滤器初始化参数
  6. init_AliasStandardObjects() ; // [7]           ----加载Bean对象

因此其加载顺序为:

  1. default.properties
  2. struts-default.xml
  3. struts-plugin.xml
  4. struts.xml
  5. struts.properties
  6. web.xml

注意:后配置的常量的值会覆盖先配置的常量的值

猜你喜欢

转载自blog.csdn.net/W2612888/article/details/85040748