java中servlet的工作原理

2021-08-13 16:00:37 字數 2646 閱讀 7884

servlet 容器的啟動過程

tomcat7 也開始支援嵌入式功能,增加了乙個啟動類 org.apache.catalina.

startup.tomcat。建立乙個例項物件並呼叫 start 方法就可以很容易啟動 tomcat,我們還可以通過這個物件來增加和修改 tomcat 的配置引數,如可以動態增加 context、servlet 等。

下面我們就利用這個 tomcat 類來管理新增的乙個 context 容器,我們就選擇 tomcat7 自帶的 examples web 工程,並看看它是如何加到這個 context 容器中的。

清單 2 . 給 tomcat 增加乙個 web 工程

清單 1 的**是建立乙個 tomcat 例項並新增乙個 web 應用,然後啟動 tomcat 並呼叫其中的乙個 helloworldexample servlet,看有沒有正確返回預期的資料。

tomcat 的 addwebapp 方法的**如下:

清單 3 .tomcat.addwebapp

前面已經介紹了乙個 web 應用對應乙個 context 容器,也就是 servlet 執行時的 servlet 容器,新增乙個 web 應用時將會建立乙個 standardcontext 容器,並且給這個 context 容器設定必要的引數,url 和 path 分別代表這個應用在 tomcat 中的訪問路徑和這個應用實際的物理路徑,這個兩個引數與清單 1 中的兩個引數是一致的。其中最重要的乙個配置是 contextconfig,這個類將會負責整個 web 應用配置的解析工作,後面將會詳細介紹。最後將這個 context 容器加到父容器 host 中。

接下去將會呼叫 tomcat 的 start 方法啟動 tomcat,如果你清楚 tomcat 的系統架構,你會容易理解 tomcat 的啟動邏輯,tomcat 的啟動邏輯是基於觀察者模式設計的,所有的容器都會繼承 lifecycle 介面,它管理者容器的整個生命週期,所有容器的的修改和狀態的改變都會由它去通知已經註冊的觀察者(listener),關於這個設計模式可以參考《 tomcat 的系統架構與設計模式,第二部分:設計模式》。tomcat 啟動的時序圖可以用圖 2 表示。

圖 2. tomcat 主要類的啟動時序圖

上圖描述了 tomcat 啟動過程中,主要類之間的時序關係,下面我們將會重點關注新增 examples 應用所對應的 standardcontext 容器的啟動過程。

當 context 容器初始化狀態設為 init 時,新增在 contex 容器的 listener 將會被呼叫。contextconfig 繼承了 lifecyclelistener 介面,它是在呼叫清單 3 時被加入到 standardcontext 容器中。contextconfig 類會負責整個 web 應用的配置檔案的解析工作。

contextconfig 的 init 方法將會主要完成以下工作:

1. 建立用於解析 xml 配置檔案的 contextdigester 物件

2. 讀取預設 context.xml 配置檔案,如果存在解析它

3. 讀取預設 host 配置檔案,如果存在解析它

4. 讀取預設 context 自身的配置檔案,如果存在解析它

5. 設定 context 的 docbase

contextconfig 的 init 方法完成後,context 容器的會執行 startinternal 方法,這個方法啟動邏輯比較複雜,主要包括如下幾個部分:

1. 建立讀取資源檔案的物件

2. 建立 classloader 物件

3. 設定應用的工作目錄

4. 啟動相關的輔助類如:logger、realm、resources 等

5. 修改啟動狀態,通知感興趣的觀察者(web 應用的配置)

6. 子容器的初始化

7. 獲取 servletcontext 並設定必要的引數

8. 初始化「load on startup」的 servlet

web 應用的初始化工作

web 應用的初始化工作是在 contextconfig 的 configurestart 方法中實現的,應用的初始化主要是要解析 web.xml 檔案,這個檔案描述了乙個 web 應用的關鍵資訊,也是乙個 web 應用的入口。

tomcat 首先會找 globalwebxml 這個檔案的搜尋路徑是在 engine 的工作目錄下尋找以下兩個檔案中的任乙個 org/apache/catalin/startup/no_default_xml 或 conf/web.xml。接著會找 hostwebxml 這個檔案可能會在 system.

getproperty("catalina.base")/conf/$/$/接著尋找應用的配置檔案 examples/web-inf/web.xml。

web.xml 檔案中的各個配置項將會被解析成相應的屬性儲存在 webxml 物件中。如果當前應用支援 servlet3.

0,解析還將完成額外 9 項工作,這個額外的 9 項工作主要是為 servlet3.0 新增的特性,包括 jar 包中的 meta-inf/web-fragment.xml 的解析以及對 annotations 的支援。

接下去將會將 webxml 物件中的屬性設定到 context 容器中,這裡包括建立 servlet 物件、filter、listener 等等。這段**在 webxml 的 configurecontext 方法中。下面是解析 servlet 的**片段:

清單 4. 建立 wrapper 例項

Servlet工作原理

servlet是執行在servlet容器中的,由servlet容器來負責servlet例項的查詢 建立以及整個生命週期的管理,servlet整個生命週期可以分為四個階段 類裝載及例項建立階段 例項初始化階段 服務階段以及例項銷毀階段。類裝載及例項建立階段 預設情況下,servlet例項是在接受到第乙...

java中關於繼承的小例子

上一次跟別人解答,沒想到沒提交上去,又不想刪了,所以做成文件,才入這行朋友可以看下 1.編碼實現動物世界的繼承關係 a 動物 animal 具有行為 吃 eat 睡覺 sleep b 受保護得物件 介面 具有得行為 beprotected c 有價值得物件 介面 具有得行為 getmoney d 老...

java實現圖論中的經典演算法

1.最短路的笛傑斯特拉演算法 author administrator 這個演算法用來解決無向圖中任意兩點的最短路徑,同時輸出路徑 起點到所有點的 public class minpath getroute w1,indexs,end return 最短距離是 distance end distan...