Java是一種動態加載和運行的語言。也就是說當應用程序持有一個類的地址(CLASSPATH)和名稱(包名和類名)的狀況下,能夠在程序運行期 間任什麼時候候加載這個類,並建立和使用該類的對象。Servlet就是基於這個機制與Web容器融合在一塊兒的。目前已知的全部支持Java Servlet的Web容器都是採用Java開發的。當Web容器接收到來自客戶端的請求信息以後,會根據URL中的Web元件地址信息到Servlet 隊列中查找對應的Servlet對象,若是找到則直接使用,若是沒有找到則加載對應的類,並建立對象。也就是說,Servlet對象是在第一次被使用的時 候才建立的,而且一旦建立就會被反覆使用,再也不建立新的對象。全部建立出的Servlet對象會在Web服務器中止運行的時候統一進行垃圾回收。html
爲 瞭解決客戶端請求地址與Java Servlet之間對應關係問題,Web容器須要一個用來描述這種對應關係的文件,通常是web.xml文件。若是一個Web應用程序中存在不少個 Servlet,那麼web.xml會變得很是龐大。在Servlet 3.0規範推出以後,容許在Servlet代碼中使用聲明式語法來代替web.xml中的描述信息,這才讓web.xml瘦身下來。下圖是這個過程的一個 示意圖。web
在這個圖中,咱們僅僅是概要的,採用以比較容 易理解的方式描述了Web容器與Servlet之間的關係,以及當接受到請求以後的處理流程。在實際的Web容器中,會比這要複雜不少。服務器
web.xml 中的listener、 filter、servlet 加載順序及其詳解多線程
1、
一、啓動一個WEB項目的時候,WEB容器會去讀取它的配置文件web.xml,讀取<listener> 和<context-param>兩個結點。
二、緊急着,容建立一個ServletContext(servlet上下文),這個 web項目的全部部分都將共享這個上下文。
三、容器將<context-param>轉換爲鍵值對,並交給 servletContext。
四、容器建立<listener>中的類實例,建立監聽器。
2、
load- on-startup 元素在web應用啓動的時候指定了servlet被加載的順序,它的值必須是一個整數。若是它的值是一個負整數或是這個元素不存 在,那麼容器會在該servlet被調用的時候,加載這個servlet 。若是值是正整數或零,容器在配置的時候就加載並初始化這個servlet,容 器必須保證值小的先被加載。若是值相等,容器能夠自動選擇先加載誰。
在servlet的配置當中,<load-on- startup>5</load-on-startup>的含義是:
標記容器是否在啓動的時候就加載這個servlet。
當 值爲0或者大於0時,表示容器在應用啓動時就加載這個servlet;
當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才 加載。
正數的值越小,啓動該servlet的優先級越高。
3、
首 先能夠確定的是,加載順序與它們在 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 的順序進行調用的。 app
參考:ui
servlet和web容器之間的關係 .net
Web容器與Servlet unix