標籤引出的 web.xml 文件的加載順序 [轉]

代碼示例 : web

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

一 . 初始化過程 tomcat

  1. 在啓動 Web 項目時 , web 容器 ( 好比tomcat ) 會先讀取 web.xml 文件中的兩個節點 <listener> 和 <context-param>
  2. 接着容器會建立一個 ServletContext 對象 (也就是 servlet上下文 ), 這個 web 項目的全部部分都將共享這個上下文
  3. 在第一步讀取的 <context-param> 信息 , 將會轉換爲鍵值對的形式 , 並交給 servletContext 對象(這些鍵值對,會被 listener , filter 等使用到 )
  4. 接着容器會建立 <listener> 註冊的監聽器對象

二 . servlet 啓動順序app

      <load-on-startup> 元素在 web 應用啓動的時候指定了 servlet 被加載的順序,它的值必須是一個整數。若是它的值是一個負整數或是這個元素不存在,那麼容器會在該 servlet 被調用的時候,加載這個 servlet 。若是值是正整數或零,容器在配置的時候就加載並初始化這個 servlet ,容器必須保證值小的先被加載。若是值相等,容器能夠自動選擇先加載誰。 在 servlet 的配置當中, <load-on-startup>5</load-on-startup> 的含義是: 標記容器是否在啓動的時候就加載這個 servlet 。 當值爲 0 或者大於 0 時,表示容器在應用啓動時就加載這個 servlet ; 當是一個負數時或者沒有指定時,則指示容器在該 servlet 被選擇時才加載。 正數的值越小,啓動該 servlet 的優先級越高spa

三 . 最終加載順序 code

      在項目中總會遇到一些關於加載的優先級問題,近期也一樣遇到過相似的,因此本身查找資料總結了下,下面有些是轉載其餘人的,畢竟人家寫的不錯,本身也就不重複造輪子了,只是略加點了本身的修飾。
      首先能夠確定的是,加載順序與它們在 web.xml 文件中的前後順序無關。即不會由於 filter 寫在 listener 的前面而會先加載 filter 。最終得出的結論是: listener --> filter --> servlet
同時還存在着這樣一種配置節: context-param ,它用於向 ServletContext 提供鍵值對,即應用程序上下文信息。咱們的 listener, filter 等在初始化時會用到這些上下文中的信息,那麼 context-param 配置節是否是應該寫在 listener 配置節前呢?實際上 context-param 配置節可寫在任意位置,
所以真正的加載順序爲: context-param -> listener -> filter -> servlet
      對於某類配置節而言,與它們出現的順序是有關的。以 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 相似 ,此處再也不贅述。
      由此,能夠看出, web.xml 的加載順序是: context-param -> listener -> filter -> servlet ,而同個類型之間的實際程序調用的時候的順序是根據對應的 mapping 的順序進行調用的。
xml

原文地址 : [ WEB容器啓動之Web.xml加載順序 ]對象

相關文章
相關標籤/搜索