002--Struts2配置文件加載順序

通過(guò)上一篇,對(duì)Struts2有了一個(gè)基本的認(rèn)識(shí),并成功的運(yùn)行了基于Struts2的第一個(gè)web項(xiàng)目。在講解配置文件之前,先來(lái)看一下這些配置文件的加載順序。

客戶(hù)端的每次請(qǐng)求到服務(wù)器都要先經(jīng)過(guò)Struts2的核心過(guò)濾器StrutsPrepareAndExecuteFilter,主要負(fù)責(zé)請(qǐng)求預(yù)處理和執(zhí)行。

在預(yù)處理中主要是來(lái)加載配置文件,對(duì)應(yīng)著源碼中的init方法。而執(zhí)行主要通過(guò)攔截器完成部分功能,對(duì)應(yīng)著過(guò)濾器的doFilter方法。

預(yù)處理

首先,從web.xml中配置的StrutsPrepareAndExecuterFilter的init方法看起,方法如下:

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);
            this.prepare = new PrepareOperations(dispatcher);
            this.execute = new ExecuteOperations(dispatcher);
            this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
            this.postInit(dispatcher, filterConfig);
        } finally {
            if(dispatcher != null) {
                dispatcher.cleanUpAfterInit();
            }

            init.cleanup();
        }

    }

init方法中調(diào)用了initDispatcher方法來(lái)加載配置文件,方法如下:

public Dispatcher initDispatcher(HostConfig filterConfig) {
        Dispatcher dispatcher = this.createDispatcher(filterConfig);
        dispatcher.init();
        return dispatcher;
    }

initDispatcher中,又調(diào)用了dispatcher.init()方法,這里面真正做了Struts2配置文件的加載,如下:

public void init() {
        if(this.configurationManager == null) {
            this.configurationManager = this.createConfigurationManager("struts");
        }

        try {
            this.init_FileManager();
            // 加載`org.apache.struts/default.properties`配置中常量
            this.init_DefaultProperties();
            // 加載struts-default.xml、struts-plugin.xml、struts.xml
            this.init_TraditionalXmlConfigurations();
            // 加載自定義的struts.properties
            this.init_LegacyStrutsProperties();
            // 加載用戶(hù)配置的provider(提供對(duì)象)
            this.init_CustomConfigurationProviders();
            // 加載web.xml文件
            this.init_FilterInitParameters();
            // 加載標(biāo)準(zhǔn)對(duì)象
            this.init_AliasStandardObjects();
            Container ex = this.init_PreloadConfiguration();
            ex.inject(this);
            this.init_CheckWebLogicWorkaround(ex);
            if(!dispatcherListeners.isEmpty()) {
                Iterator i$ = dispatcherListeners.iterator();

                while(i$.hasNext()) {
                    DispatcherListener l = (DispatcherListener)i$.next();
                    l.dispatcherInitialized(this);
                }
            }

            this.errorHandler.init(this.servletContext);
        } catch (Exception var4) {
            if(LOG.isErrorEnabled()) {
                LOG.error("Dispatcher initialization failed", var4, new String[0]);
            }

            throw new StrutsException(var4);
        }
    }

通過(guò)源碼分析,可以看到配置文件的加在順序如下:

default.properties
struts-default.xml
struts-plugin.xml
struts.xml // 配置Action以及常量
struts.properties // 配置常量
web.xml // 配置核心過(guò)濾器及常量

前三個(gè)為Struts2內(nèi)部配置文件,無(wú)法對(duì)其修改,我們所需要關(guān)注的是struts.xmlstruts.properties、web.xml三個(gè)文件。

因?yàn)檫@幾個(gè)文件加載是有順序的,后三個(gè)配置文件都可以修改Struts2常量值,需要注意的是,后者會(huì)覆蓋前者。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容