strut2-default.xml(默認配置的),struts-plugin.xml(若是與spring整合),struts2.xml(本身配置的)java
每個配置文件的內容主要分爲三類,一類是定義的bean,一類是常量<constant>,一類是packagenode
入口方法: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>
入口:XmlConfigurationProvider-->addAction
這裏一樣會解析屬性,子標籤等,而後封裝成ActionConfig,同時會放到PackageConfig的actionConfigs屬性下
DefaultConfiguration--->rebuildRuntimeConfiguration()
第3,4步將配置文件解析完畢,僅僅解析出了配置文件裏的內容。接下來是重建運行時配置
爲何要重建運行時配置?
由於,配置文件配置的只是用戶配置的,還有好多的默認配置,須要從新解析一下,這樣才能更好的處理請求。3,4步解析出來,自定義的ActionConfig PackageConfig中的攔截器,異常映射,返回結果類型等可能都是空的,這說明有繼承父包的一些屬性
好比:extends繼承的父包的一些配置,一些全局性的配置(攔截器配置,異常映射配置等),重建之後,ActionConfig所須要的必要信息就全了。(攔截器信息不可少)