Web.xml詳解:html
1.web.xml加載過程(步驟)java
首先簡單講一下,web.xml的加載過程。當啓動一個WEB項目時,容器包括(JBoss、Tomcat等)首先會讀取項目web.xml配置文件裏的配置,當這一步驟沒有出錯而且完成以後,項目才能正常地被啓動起來。web
1. 啓動WEB項目的時候,容器首先會去它的配置文件web.xml讀取兩個節點: <listener></listener>和<context-param></context-param>。spring
2. 緊接着,容器建立一個ServletContext(application),這個WEB項目全部部分都將共享這個上下文。數據庫
3. 容器以<context-param></context-param>的name做爲鍵,value做爲值,將其轉化爲鍵值對,存入ServletContext。app
4. 容器建立<listener></listener>中的類實例,根據配置的class類路徑<listener-class>來建立監聽,在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,啓動Web應用時,系統調用Listener的該方法,在這個方法中得到:jsp
context-param的值就是application.getInitParameter("context-param的鍵");獲得這個context-param的值以後,你就能夠作一些操做了。分佈式
5. 舉例:你可能想在項目啓動以前就打開數據庫,那麼這裏就能夠在<context-param>中設置數據庫的鏈接方式(驅動、url、user、password),在監聽類中初始化數據庫的鏈接。這個監聽是本身寫的一個類,除了初始化方法,它還有銷燬方法,用於關閉應用前釋放資源。好比:說數據庫鏈接的關閉,此時,調用contextDestroyed(ServletContextEvent args),關閉Web應用時,系統調用Listener的該方法。編碼
6. 接着,容器會讀取<filter></filter>,根據指定的類路徑來實例化過濾器。url
7. 以上都是在WEB項目尚未徹底啓動起來的時候就已經完成了的工做。若是系統中有Servlet,則Servlet是在第一次發起請求的時候被實例化的,並且通常不會被容器銷燬,它能夠服務於多個用戶的請求。因此,Servlet的初始化都要比上面提到的那幾個要遲。
8. 總的來講,web.xml的加載順序是:<context-param>-><listener>-><filter>-><servlet>。其中,若是web.xml中出現了相同的元素,則按照在配置文件中出現的前後順序來加載。
9. 對於某類元素而言,與它們出現的順序是有關的。以<filter>爲例,web.xml中固然能夠定義多個<filter>,與<filter>相關的一個元素是<filter-mapping>,注意,對於擁有相同<filter-name>的<filter>和<filter-mapping>元素而言,<filter-mapping>必須出如今<filter>以後,不然當解析到<filter-mapping>時,它所對應的<filter-name>還未定義。web容器啓動初始化每一個<filter>時,按照<filter>出現的順序來初始化的,當請求資源匹配多個<filter-mapping>時,<filter>攔截資源是按照<filter-mapping>元素出現的順序來依次調用doFilter()方法的。<servlet>同<filter>相似,此處再也不贅述。
2.web.xml標籤詳解
1. XML文檔有效性檢查這段代碼指定文件類型定義(DTD),能夠經過它檢查XML文檔的有效性。下面顯示的<!DOCTYPE>元素有幾個特性,這些特性告訴咱們關於DTD的信息:
2. <web-app></web-app>
部署描述符的根元素是<web-app>。DTD文件規定<web-app>元素的子元素的語法以下:
正如您所看到的,這個元素含有23個子元素,並且子元素都是可選的。問號(?)表示子元素是可選的,並且只能出現一次。星號(*)表示子元素可在部署描述符中出現零次或屢次。有些子元素還能夠有它們本身的子元素。web.xml文件中<web-app>元素聲明的是下面每一個子元素的聲明。下面講述部署描述符中可能包含的全部子元素。
注意:在Servlet 2.3中,子元素必須按照DTD文件語法描述中指定的順序出現。好比:若是部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>兩個子元素,則<servlet>子元素必須出如今<servlet-mapping>子元素以前。在Servlet2.4中,順序並不重要。
3. <display-name></display-name>
<display-name>test-hwp-web-application</display-name>定義了web應用的名稱,能夠在http://localhost:8080/manager/html中顯示。
4. <distributable/>
<distributable/>可使用distributable元素來告訴servlet/JSP容器,Web容器中部署的應用程序適合在分佈式環境下運行。
5. <context-param></context-param>
<!--****************************上下文初始化參數***************************--> <context-param> <param-name>webAppRootKey</param-name> <param-value>business.root</param-value> </context-param> <!-- spring config --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-configuration/*.xml</param-value> </context-param>
<!-- spring config --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-configuration/*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<welcome-file-list>包含一個子元素<welcome-file>,<welcome-file>用來指定首頁文件名稱。<welcome-file-list>元素能夠包含一個或多個<welcome-file>子元素。若是在第一個<welcome-file>元素中沒有找到指定的文件,Web容器就會嘗試顯示第二個,以此類推。