天天看點

JSP/Servlet 工作原理

Servlet Servlet 沒有 main 方法,不能夠獨立的運作,它的運作需要容器的支援,Tomcat 是最常用的 JSP/Servlet 容器。

Servlet 運作在 Servlet 容器中,并由容器管理從建立到銷毀的整個過程。

(1) 加載和執行個體化

Servlet 容器裝載和執行個體化一個 Servlet。建立出該 Servlet 類的一個執行個體。

(2) 初始化

在 Servlet 執行個體化完成之後,容器負責調用該 Servlet 執行個體的 init() 方法,在處理使用者請求之前,來做一些額外的初始化工作。

(3) 處理請求

當 Servlet 容器接收到一個 Servlet 請求時,便運作與之對應的 Servlet 執行個體的 service() 方法,service() 方法再派遣運作與請求相對應的

doXX(doGet,doPost) 方法來處理使用者請求。

(4) 銷毀

當 Servlet 容器決定将一個 Servlet 從伺服器中移除時 ( 如 Servlet 檔案被更新 ),便調用該 Servlet 執行個體的 destroy() 方法,在銷毀該 Servlet 執行個體之前,

來做一些其他的工作。

其中,(1)(2)(4) 在 Servlet 的整個生命周期中隻會被執行一次。

結合右邊給出的流程圖:

當用戶端浏覽器向伺服器請求一個 Servlet 時,伺服器收到該請求後,首先到容器中檢索與請求

比對的 Servlet 執行個體是否已經存在。若不存在,則 Servlet 容器負責加載并執行個體化出該類 Servlet

的一個執行個體對象,接着容器架構負責調用該執行個體的 init() 方法來對執行個體做一些初始化工作,然後

Servlet 容器運作該執行個體的 service() 方法。

若 Servlet 執行個體已經存在,則容器架構直接調用該執行個體的 service() 方法。

service() 方法在運作時,自動派遣運作與使用者請求相對應的 doXX() 方法來響應使用者發起的請求。

通常,每個 Servlet 類在容器中隻存在一個執行個體,每當請求到來時,則配置設定一條線程來處理該請求。

當用戶端浏覽器向伺服器請求一個 JSP 頁面時,伺服器收到該請求後,首先檢查所請求的這個

JSP 檔案内容 ( 代碼 ) 是否已經被更新,或者是否是 JSP 檔案建立後的第一次被通路,如果是,

那麼,這個 JSP 檔案就會在伺服器端的 JSP 引擎作用下轉化為一個 Servlet 類的 Java 源代碼

檔案。緊接着,這個 Servlet 類會在 Java 編譯器的作用下被編譯成一個位元組碼檔案,并裝載

到 jvm 解釋執行。剩下的就等同于 Servlet 的處理過程了。

如果被請求的 JSP 檔案内容 ( 代碼 ) 沒有被修改,那麼它的處理過程也等同于一個 Servlet 的

處理過程。即直接由伺服器檢索出與之對應的 Servlet 執行個體來處理。

需要注意的是,JSP 檔案不是在伺服器啟動的時候轉換成 Servlet 類的。而是在被用戶端通路

的時候才可能發生轉換的 ( 如 JSP 檔案内容沒有被更新等,就不再發生 Servlet 轉換 )。

就 Tomcat 而言,打開目錄 %Tomcat%/work/%您的工程檔案目錄%,然後會看到裡面有 3

個子目錄:org/apache/jsp,若沒有這 3 個目錄,說明項目的 JSP 檔案還沒有被通路過,

打開進到 jsp 目錄下,會看到一些 *_jsp.java 和 *_jsp.class 檔案,這就是 JSP 檔案被轉換成

Servlet 類的源檔案和位元組碼檔案了。

有興趣的話,可以使用浏覽器通路伺服器中的 JSP,然後觀察 JSP 轉換 Servlet 以及編譯的時機。

JSP 本質是一個 Servlet,它的運作也需要容器的支援。

在 JSP 和 Servlet 檔案中都可以編寫 Java 和 HTML 代碼,不同的是,

Servlet 雖然也可以動态的生成頁面内容,但更加偏向于邏輯的控制。

JSP 最終被轉換成 Servlet 在 jvm 中解釋執行,在 JSP 中雖然也可以編寫 Java 代碼,但它更加偏向于頁面視圖的展現。

在 MVC 架構模式中,就 JSP 和 Servlet 而言,C 通常由 Servlet 充當,V 通常由 JSP 來充當。

   [ 随筆均原創,轉載請注明出處:http://www.blogjava.net/fancydeepin ]

繼續閱讀