web.xml 中的listener、 filter、servlet 加載順序

轉自:http://www.cnblogs.com/shenliang123/p/3344555.html

在項目中總會遇到一些關於加載的優先級問題,剛剛就遇到了一個問題,由於項目中使用了quartz任務調度,quartz在web.xml中是使用listener進行監聽的,使得在tomcat啓動的時候能馬上檢查數據庫查看那些任務未被按時執行,而數據庫的配置信息在是在web.xml中使用servlet配置的,導致tomcat啓動後在執行quartz任務時報空指針,原因就是servlet中的數據庫連接信息未被加載。網上查詢了下web.xml中配置的加載優先級:

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

發佈了21 篇原創文章 · 獲贊 10 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章