1. 程式人生 > >JSP的結構和生命週期

JSP的結構和生命週期

1.JSP的結構

網路伺服器需要一個JSP引擎,也就是一個容器來處理JSP頁面。容器負責截獲對JSP頁面的請求。JSP容器和Web伺服器協同合作,為JSP的正常執行提供必要的執行環境和其它服務,並且能夠正確識別專屬於JSP網頁的特殊元素。

下圖顯示了JSP容器和JSP檔案在Web應用中所處的位置:


2.JSP處理

Web伺服器是通過如下步驟使用JSP來建立網頁的:

  1. 客戶瀏覽器給伺服器傳送一個HTTP請求;
  2. Web伺服器識別出這是一個JSP網頁的請求,並且將該請求傳遞給JSP引擎。通過使用URL或.jsp檔案來完成;
  3. JSP引擎從磁碟中載入JSP檔案,然後將它們轉化為servlet。這種轉化只是簡單地將所有模板文字改用println()語句,並且將所有的JSP元素轉化成Java程式碼;
  4. JSP引擎將servlet編譯成可執行類,並且將原始請求傳遞給servlet引擎;
  5. Web伺服器的某元件將會呼叫servlet引擎,然後載入並執行servlet類。在執行的過程中,servlet產生HTML格式的輸出並將其內嵌與HTTP的response上交給Web伺服器;
  6. Web伺服器以靜態HTML網頁的形式將HTTP的response返回給瀏覽器;
  7. 最終,Web瀏覽器處理HTTP response中動態產生的HTML網頁,就好像在處理靜態網頁一樣;
流程如下圖:

一般情況下,JSP引擎會檢查JSP檔案對應的servlet是否已經存在,並且檢查JSP檔案的修改日期是否早於servlet。如果JSP檔案的修改時間早於對應的servlet,那麼容器就可以確定JSP檔案沒有被修改過並且servlet有效。 這使得整個流程與其他指令碼語言相比要高效快捷一些。3.JSP的生命週期
理解JSP的生命週期是理解JSP底層功能的關鍵。JSP的生命週期包括以下幾個階段:
  • 編譯階段:servlet容器編譯servlet原始檔,生成servlet類;
  • 初始化階段:載入與JSP對應的servlet類,建立其例項,並呼叫它的初始化方法;
  • 執行階段:呼叫與JSP對應的servlet例項的服務方法;
  • 銷燬階段:呼叫與JSP對應的servlet例項的銷燬方法,然後銷燬servlet例項;
生命週期如下圖所示:

(1)JSP編譯當瀏覽器發起請求時,JSP引擎將編譯JSP檔案。流程如下圖:

有三個步驟:
  1. 解析JSP檔案;
  2. 將JSP檔案轉化為servlet;
  3. 編譯servlet;
這裡,首先判斷是不是第一次請求,如果是的話,也就是說JSP還沒有被編譯過,JSP引擎就把相應的JSP檔案編譯成servlet,生成位元組碼檔案,並呼叫jspInit();如果不是第一次請求,說明已經有了位元組碼檔案,那麼就開始解析執行,呼叫jspServive()。jspService()方法被呼叫來處理客戶端的請求,對於每一個請求,JSP引擎將建立一個新的執行緒來處理請求。如果有多個客戶端同時請求JSP檔案,則JSP引擎將會建立多個執行緒,每個客戶端對應一個執行緒。同時,servlet始終存在記憶體中,因此相應很快。(2)JSP初始化容器載入JSP檔案後,它會在為請求提供任何服務前呼叫jspInit()方法。如果需要執行自定義的JSP初始化任務,複寫jspInit()方法就行了,就像下面這樣:
public void jspInit() {  
    //init code  
}  
通常,程式只初始化一次。(3)JSP執行這一階段描述了JSP生命週期中一切與請求相關的互動行為,直到被銷燬。當JSP頁面完成初始化後,呼叫jspService()方法執行。(4)JSP清理JSP生命週期的銷燬階段描述了當一個JSP網頁從容器中被移除時所發生的一切。
jspDestroy()方法在JSP中等價於servlet中的銷燬方法。當您需要執行任何清理工作時複寫jspDestroy()方法,比如釋放資料庫連線或者關閉資料夾等等。