web.xml是怎麼被解析的?

這裏輸入引用文本在Tomcat的conf目錄下,有關於全局組件配置的server.xml,有關於角色與用戶配置的tomcat-users.xml文件,有關於包內訪問安全限制及自定義ClassLoader的catalina.properties文件,還有一個用於作部署在此Tomcat內全部web應用的全局配置的web.xml。 相似於面向對象編程中的父類的概念。全部的應用都會將此文件中定義的信息包含,和應用程序自身的web.xml作一個相似merge的操做。web

瞭解了以上信息以後,來看一下Tomcat內部是如何解析web.xml文件的。apache

web.xm組件加載順序爲:context-param -> listener -> filter -> servlet(同類則按編寫順序執行)。 tomcat啓動時序圖編程

解析web.xml的代碼,位於ContextConfig類中:tomcat

Set<WebXml> defaults = new HashSet<>();
defaults.add(getDefaultWebXmlFragment());//首先是默認web.xml
WebXml webXml = createWebXml();

// Parse context level web.xml
InputSource contextWebXml = getContextWebXmlSource();
if (!webXmlParser.parseWebXml(contextWebXml, webXml, false)) {
    ok = false;
}

再以後是Servlet3的新特性中的web-fragement特性。須要先解析已有jar包中是否包含自定義配置安全

/* Ordering is important here
 Step 1. Identify all the JARs packaged with the application and those
 provided by the container. If any of the application JARs have a
 web-fragment.xml it will be parsed at this point. web-fragment.xml
files are ignored for container provided JARs.
*/

Map<String,WebXml> fragments = processJarsForWebFragments(webXml);

// Step 2. Order the fragments.

Set<WebXml> orderedFragments = null;
orderedFragments = WebXml.orderWebFragments(webXml, fragments, sContext);

以後則是把web-fragement.xml和web.xml合到一塊兒。app

/* Step 7. Apply global defaults
        Have to merge defaults before JSP conversion since defaults
        provide JSP servlet definition.
*/
    webXml.merge(defaults); //merge全局web.xml,這裏是先放進去,後續自定義的會覆蓋

再向下走到merge應用自定義的web.xml中。ide

// Step 9. Apply merged web.xml to Context
if (ok) {
    configureContext(webXml);
}
相關文章
相關標籤/搜索