1. 程式人生 > >WEB容器啟動之Web.xml載入順序

WEB容器啟動之Web.xml載入順序

web.xml檔案載入順序

一、

     1 、啟動一個 WEB 專案的時候, WEB 容器會去讀取它的配置檔案 web.xml ,讀取 <listener> <context-param> 兩個結點。

     2 、緊急著,容建立一個 ServletContext servlet 上下文),這個 web 專案的所有部分都將共享這個上下文。

     3 、容器將 <context-param> 轉換為鍵值對,並交給 servletContext

     4 、容器建立 <listener> 中的類例項,建立監聽器。

二、

      load-on-startup 元素在 web 應用啟動的時候指定了 servlet 被載入的順序,它的值必須是一個整數。如果它的值是一個負整數或是這個元素不存在,那麼容器會在該 servlet 被呼叫的時候,載入這個 servlet 。如果值是正整數或零,容器在配置的時候就載入並初始化這個 servlet ,容器必須保證值小的先被載入。如果值相等,容器可以自動選擇先載入誰。 在 servlet 的配置當中, <load-on-startup>5</load-on-startup> 的含義是: 標記容器是否在啟動的時候就載入這個 servlet 。 當值為

0 或者大於 0 時,表示容器在應用啟動時就載入這個 servlet ; 當是一個負數時或者沒有指定時,則指示容器在該 servlet 被選擇時才載入。 正數的值越小,啟動該 servlet 的優先順序越高。

三、

      在專案中總會遇到一些關於載入的優先順序問題,近期也同樣遇到過類似的,所以自己查詢資料總結了下,下面有些是轉載其他人的,畢竟人家寫的不錯,自己也就不重複造輪子了,只是略加點了自己的修飾。

      首先可以肯定的是,載入順序與它們在 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 的順序進行呼叫的。