JSP/Servlet工作原理

 當客戶端瀏覽器向服務器請求一個 Servlet 時,服務器收到該請求後,首先到容器中檢索與請求匹配的 Servlet 實例是否已經存在。

     若不存在,則 Servlet 容器負責加載並實例化出該類 Servlet的一個實例對象,接着容器框架負責調用該實例的 init() 方法來對實例做一些初始化工作,然後Servlet 容器運行該實例的 service() 方法。

       若 Servlet 實例已經存在,則容器框架直接調用該實例的 service() 方法。

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

通常,每個 Servlet 類在容器中只存在一個實例,每當請求到來時,則分配一條線程來處理該請求。

在處理請求時:

1、Servlet容器會創建一個請求對象ServletRequst,其中封裝了用戶請求的信息,以便處理客戶端請求,此外還會創建一個響應對象ServletResponse,用於響應客戶端請求,想客戶端返回數據。

2、然後Servlet容器把創建好的ServletRequst和ServletResponse對象傳給用戶所請求的Servlet。

3、Servlet利用ServletResponse包含的數據和自身的業務邏輯處理請求,並把處理好的結果寫在ServletResponse中,最後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 以及編譯的時機

結合如下流程圖:

Servlet和Jsp

JSP 本質是一個 Servlet,它的運行也需要容器的支持。
在 JSP 和 Servlet 文件中都可以編寫 Java 和 HTML 代碼,不同的是,
Servlet 雖然也可以動態的生成頁面內容,但更加偏向於邏輯的控制。
JSP 最終被轉換成 Servlet 在 jvm 中解釋執行,在 JSP 中雖然也可以編寫 Java 代碼,但它更加偏向於頁面視圖的展現。

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

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