Java web項目listener Filter servlet啟動順序和配置
一、
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,容 器必須保證值小的先被加載。如果值相等,容器可以自動選擇先加載誰。
-->可見0最先被加載,然後1、2、3、、、負數
在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 的順序進行調用的。
web.xml檔案詳解
Web.xml常用元素
<web-app>
<display-name></display-name>定義了WEB應用的名字
<description></description> 聲 明WEB應用的描述資訊
<context-param></context- param> context-param元素聲明應用範圍内的初始化參數。
<filter></filter> 過 濾器元素将一個名字與一個實作javax.servlet.Filter接口的類相關聯。
<filter- mapping></filter-mapping> 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或 多個servlet或JSP頁面相關聯。
<listener></listener>servlet API的版本 2.3增加了對事件監聽程式的支援,事件監聽程式在建立、修改和删除會話或servlet環境時得到通知。
Listener 元素指出事件監聽程式類。
<servlet></servlet> 在向servlet或JSP頁面制定初始化參數 或定制URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。
<servlet- mapping></servlet-mapping> 伺服器一般為servlet提供一個預設的URL:http://host /webAppPrefix/servlet/ServletName。
但是,常常會更改這個URL,以便 servlet可以通路初始化參數或更容易地處理相對URL。在更改預設URL時,使用servlet-mapping元素。
<session- config></session-config> 如果某個會話在一定時間内未被通路,伺服器可以抛棄它以節省記憶體。
可 通過使用HttpSession的setMaxInactiveInterval方法明确設定單個會話對象的逾時值,或者可利用session- config元素制定預設逾時值。 http://www.cnblogs.com/jifeng/archive/2010/10/22/1857937.html 最終結論:
web.xml 的加載順序是:[context-param -> listener -> filter -> servlet -> spring] ,而同類型節點之間的實際程式調用的時候的順序是根據對應的 mapping 的順序進行調用的。