JSP學習

什麼是JSP?

JSP全稱是Java Server Pages,是一種動態網頁開發技術,它使用JSP標籤在HTML中插入Java代碼。標籤通常以<%開頭以%>結束。

JSP是一種Java servelet,主要用於實現Java web應用程序的用戶界面部分。網頁開發者可以通過結合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操作和命令來編寫JSP。

JSP通過網頁表單來獲取輸入數據、訪問數據庫和其他數據資源,然後動態的創建網頁。

JSP標籤有多種功能,比如訪問數據庫,記錄用戶選擇信息、訪問JavaBeans組件等,還可以在不同的網頁中傳遞控制信息和共享信息。

爲什麼使用JSP?

JSP程序與CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下優勢:

  • 性能更加優越,因爲JSP可以直接在HTML網頁中動態嵌入元素而不需要單獨引用CGI文件。
  • 服務器調用的是已經編譯好的JSP文件,而不像CGI/Perl那樣必須先載入解釋器和目標腳本。
  • JSP 基於Java Servlet API,因此,JSP擁有各種強大的企業級Java API,包括JDBC,JNDI,EJB,JAXP等等。
  • JSP頁面可以與處理業務邏輯的 Servlet 一起使用,這種模式被Java servlet 模板引擎所支持。

最後,JSP是Java EE不可或缺的一部分,是一個完整的企業級應用平臺。這意味着JSP可以用最簡單的方式來實現最複雜的應用。

JSP的優勢

以下列出了使用JSP帶來的其他好處:

  • 與ASP相比:JSP有兩大優勢。首先,動態部分用Java編寫,而不是VB或其他MS專用語言,所以更加強大與易用。第二點就是JSP易於移植到非MS平臺上。
  • 與純 Servlet 相比:JSP可以很方便的編寫或者修改HTML網頁而不用去面對大量的println語句。
  • 與SSI相比:SSI無法使用表單數據、無法進行數據庫鏈接。
  • 與JavaScript相比:雖然JavaScript可以在客戶端動態生成HTML,但是很難與服務器交互,因此不能提供複雜的服務,比如訪問數據庫和圖像處理等等。
  • 與靜態HTML相比:靜態HTML不包含動態信息。

JSP結構

網絡服務器需要一個 JSP 引擎,也就是一個容器來處理 JSP 頁面。容器負責截獲對 JSP 頁面的請求。本教程使用內嵌 JSP 容器的 Apache 來支持 JSP 開發。

JSP 容器與 Web 服務器協同合作,爲JSP的正常運行提供必要的運行環境和其他服務,並且能夠正確識別專屬於 JSP 網頁的特殊元素。

下圖顯示了 JSP 容器和 JSP 文件在 Web 應用中所處的位置。

JSP處理

  • 就像其他普通的網頁一樣,您的瀏覽器發送一個 HTTP 請求給服務器。

  • Web 服務器識別出這是一個對 JSP 網頁的請求,並且將該請求傳遞給 JSP 引擎。通過使用 URL或者 .jsp 文件來完成。

  • JSP 引擎從磁盤中載入 JSP 文件,然後將它們轉化爲 Servlet。這種轉化只是簡單地將所有模板文本改用 println() 語句,並且將所有的 JSP 元素轉化成 Java 代碼。

  • JSP 引擎將 Servlet 編譯成可執行類,並且將原始請求傳遞給 Servlet 引擎。

  • Web 服務器的某組件將會調用 Servlet 引擎,然後載入並執行 Servlet 類。在執行過程中,Servlet 產生 HTML 格式的輸出並將其內嵌於 HTTP response 中上交給 Web 服務器。

  • Web 服務器以靜態 HTML 網頁的形式將 HTTP response 返回到您的瀏覽器中。

  • 最終,Web 瀏覽器處理 HTTP response 中動態產生的HTML網頁,就好像在處理靜態網頁一樣。

一般情況下,JSP 引擎會檢查 JSP 文件對應的 Servlet 是否已經存在,並且檢查 JSP 文件的修改日期是否早於 Servlet。如果 JSP 文件的修改日期早於對應的 Servlet,那麼容器就可以確定 JSP 文件沒有被修改過並且 Servlet 有效。這使得整個流程與其他腳本語言(比如 PHP)相比要高效快捷一些。

JSP生命週期

理解JSP底層功能的關鍵就是去理解它們所遵守的生命週期。

JSP生命週期就是從創建到銷燬的整個過程,類似於servlet生命週期,區別在於JSP生命週期還包括將JSP文件編譯成servlet。

以下是JSP生命週期中所走過的幾個階段:

  • 編譯階段:

    servlet容器編譯servlet源文件,生成servlet類

  • 初始化階段:

    加載與JSP對應的servlet類,創建其實例,並調用它的初始化方法

  • 執行階段:

    調用與JSP對應的servlet實例的服務方法

  • 銷燬階段:

    調用與JSP對應的servlet實例的銷燬方法,然後銷燬servlet實例

JSP編譯

當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個文件。如果這個文件沒有被編譯過,或者在上次編譯後被更改過,則編譯這個JSP文件。

編譯的過程包括三個步驟:

  • 解析JSP文件。
  • 將JSP文件轉爲servlet。
  • 編譯servlet。

JSP初始化:

容器載入JSP文件後,它會在爲請求提供任何服務前調用jspInit()方法。如果您需要執行自定義的JSP初始化任務,複寫jspInit()方法就行了,就像下面這樣:

public void jspInit(){
  // 初始化代碼
}

一般來講程序只初始化一次,servlet也是如此。通常情況下您可以在jspInit()方法中初始化數據庫連接、打開文件和創建查詢表。

JSP執行

這一階段描述了JSP生命週期中一切與請求相關的交互行爲,直到被銷燬。

當JSP網頁完成初始化後,JSP引擎將會調用_jspService()方法。

_jspService()方法需要一個HttpServletRequest對象和一個HttpServletResponse對象作爲它的參數,就像下面這樣:

void _jspService(HttpServletRequest request,
                 HttpServletResponse response)
{
   // 服務端處理代碼
}

_jspService()方法在每個request中被調用一次並且負責產生與之相對應的response,並且它還負責產生所有7個HTTP方法的迴應,比如GET、POST、DELETE等等。

JSP清理

JSP生命週期的銷燬階段描述了當一個JSP網頁從容器中被移除時所發生的一切。

jspDestroy()方法在JSP中等價於servlet中的銷燬方法。當您需要執行任何清理工作時複寫jspDestroy()方法,比如釋放數據庫連接或者關閉文件夾等等。

jspDestroy()方法的格式如下:

public void jspDestroy()
{
   // 清理代碼
}

上述內容均來自於菜鳥教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章