struts2源碼系列(4)--配置文件解析

1.struts.xml配置文件主要有三個

strut2-default.xml(默認配置的),struts-plugin.xml(若是與spring整合),struts2.xml(本身配置的)java

2.配置文件的加載流程

每個配置文件的內容主要分爲三類,一類是定義的bean,一類是常量<constant>,一類是packagenode

3.解析package過程

入口方法:DefaultConfiguration-->reloadContainer()spring

public synchronized List<PackageProvider> reloadContainer(List<ContainerProvider> providers) throws ConfigurationException {
                
            // 解析配置文件中的package標籤
            for (final ContainerProvider containerProvider : providers)
            {
                if (containerProvider instanceof PackageProvider) {
                    container.inject(containerProvider);
                    ((PackageProvider)containerProvider).loadPackages();
                    packageProviders.add((PackageProvider)containerProvider);
                }
            }

}

接着進入XmlConfigurationProvider-->loadPackages()app

for (Document doc : documents) {
            Element rootElement = doc.getDocumentElement();
            NodeList children = rootElement.getChildNodes();
            int childSize = children.getLength();

            for (int i = 0; i < childSize; i++) {
                Node childNode = children.item(i);

                if (childNode instanceof Element) {
                    Element child = (Element) childNode;

                    final String nodeName = child.getNodeName();

                    if ("package".equals(nodeName)) {
                        PackageConfig cfg = addPackage(child);//構造一個PackageConfig對象
                        if (cfg.isNeedsRefresh()) {
                            reloads.add(child);
                        }
                    }
                }
            }
            loadExtraConfiguration(doc);
        }

接下來就是解析<package>標籤元素--ide

解析屬性信息:extends屬性--繼承的父包名稱   abstract--是不是抽象的包默認false  name--包的名稱   namespace--命名空間默認""  strict-method-invocation--是不是嚴格的方法執行默認falseui

若是有繼承的父包,則解析父包信息:根據配置的父包的名稱,找到是否配置了這樣一個包,若是找到了就把對應的父包PackageConfig添加進去,不然拋出異常不存在這樣的父包spa

 

解析結果類型<result-types>--封裝成LinkedHashmap---key 結果類型名稱,value值爲對應的結果類型class名稱code

解析攔截器 <interceptors>---封裝成LinkedHashmap---key爲攔截器名稱,value值爲攔截器class名稱xml

解析默認的攔截器引用<default-interceptor-ref>--字符串---只取name屬性,表明的確實多個攔截器(也就是攔截器棧)對象

解析默認的class引用<default-class-ref>---字符串--只取class屬性,實際上是一個類的class

解析全局的結果類型 <global-results>

解析全局的exception映射<global-exception-mappings>

解析action<action>---下面介紹

解析默認的action引用<default-action-ref>

4.解析action過程

入口:XmlConfigurationProvider-->addAction

這裏一樣會解析屬性,子標籤等,而後封裝成ActionConfig,同時會放到PackageConfig的actionConfigs屬性下

5.重建運行時配置

DefaultConfiguration--->rebuildRuntimeConfiguration()

第3,4步將配置文件解析完畢,僅僅解析出了配置文件裏的內容。接下來是重建運行時配置

爲何要重建運行時配置?

由於,配置文件配置的只是用戶配置的,還有好多的默認配置,須要從新解析一下,這樣才能更好的處理請求。3,4步解析出來,自定義的ActionConfig PackageConfig中的攔截器,異常映射,返回結果類型等可能都是空的,這說明有繼承父包的一些屬性

好比:extends繼承的父包的一些配置,一些全局性的配置(攔截器配置,異常映射配置等),重建之後,ActionConfig所須要的必要信息就全了。(攔截器信息不可少)

相關文章
相關標籤/搜索