1. 程式人生 > >Struts2執行流程及配置檔案載入順序

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

注意:後配置的常量的值會覆蓋先配置的常量的值