1. 程式人生 > >web容器中web.xml中Servlet、Filter、context-param、listener的載入順序

web容器中web.xml中Servlet、Filter、context-param、listener的載入順序

  web容器在啟動web專案的時候,會根據專案中的web.xml配置檔案進行專案的初始化操作,

通過對web容器的原始碼分析和專案實踐,我們可以大致得出以下載入順序:

1)、載入<context-param>,(多個context-param的載入順序由容器自行決定,可以認為是自上而下,但有待於考證)根據配置資訊,初始化上下文資訊(ServletContext),因為上下文資訊在整個容器中會被servlet、filter、listener的使用,所以會首先被載入;

2)、載入<listener>,(多個listener的載入順序由容器自行決定,可以認為是自上而下,但有待於考證),根據上下文資訊,建立監聽器類的例項;

3)、載入<filter>,(多個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() 方法的。 

4)、載入<servlet>,對於配置多個servlet,容器會根據load- on-startup 元素在web應用啟動的時候指定了servlet被載入的順序,它的值必須是一個整數。如果它的值是一個負整數或是這個元素不存在,那麼容器會在該servlet被呼叫的時候,載入這個servlet 。如果值是正整數或零,容器在配置的時候就載入並初始化這個servlet,容器必須保證值小的先被載入。如果值相等,容器可以自動選擇先載入誰。

總結,web.xml 的載入順序是:context- param -> listener -> filter -> servlet