在JSP編譯的時候,伺服器內部做了什嗎?
來源:互聯網
上載者:User
js|編譯|伺服器 作者/出處:Blueski編譯
在JSP第一次獲得請求時,不管請求來自於用戶端瀏覽器還是伺服器上的servlet, JSP檔案將被JSP引擎(JSP engine)轉換成為一個servlet。而這個引擎本身也是一個servlet,在JSWDK,它就是 JspServlet。
在編譯時間候如果發現jsp檔案有任何語法錯誤,轉換過程將中斷,並向用戶端發出出錯資訊;而如果編譯成功了,則所轉換產生的servlet代碼被編譯,然後該servlet被JSP引擎載入到記憶體中。此時JSP引擎還請求了jspInit()方法的執行,並對此servlet做初始化。jspInit()方法在servlet的生命週期中只被請求一次。然後jspService()方法被調用來處理用戶端的請求和回複操作。對於所有的隨後而來的對該JSP檔案的請求,伺服器將檢查該.jsp檔案自最後一次被存取後是否經過修改。如果沒有修改則請求將交給還在記憶體中的servlet的jspService()方法以一種同時發生的方式加以處理。注意,由於 servlet始終駐於記憶體,所以響應是非常快的。
如果.jsp檔案被修改了,伺服器將自動地對檔案重新編譯,並將結果取代記憶體中的servlet,並繼續上述處理過程。
雖然JSP效率很高,但在第一次調用時由於需要轉換和編譯而有一些輕微的延遲。 此外,如果在任何時候如果由於系統資源不足的原因,JSP引擎將以某種不確定的方式將servlet從記憶體中移去。當這種情況發生時jspDestroy()方法首先被調用, 然後servlet執行個體便被標記加入“垃圾收集”處理。
相關內容:
jsp先行編譯器:
Jakarata Tomcat3.1 JSP伺服器 (http://jakarta.apache.org)包含了一個 JSP編譯器(JSPC),可以進行先行編譯,既可以定義一個web應用的檔案目錄,也可以指定某個特定jsp檔案來進行編譯。
另外,oracle也有jspc