1. 程式人生 > >web 基礎鞏固——JSP基礎

web 基礎鞏固——JSP基礎

本文按照官網文件總結,但是有可能會理解錯誤,學習時儘量和其他網站進行對比,同時也歡迎指出錯誤,好讓我及時改正

什麼是JSP頁面?

JSP頁面是一個文字文件,包含兩種型別的文字:靜態資料,可以用任何基於文字的格式(如HTML,SVG,WML和XML)表示,JSP元素構成動態內容。

JSP頁面中的JSP元素可以用兩種語法表示,standard  和 XML,雖然任何給定的檔案只能使用一種語法。XML語法中的JSP頁面是XML文件,可以通過XML文件的工具和API進行操作。

JSP頁面的原始檔的推薦副檔名是.jsp。該頁面可以由頂級檔案組成,該頂級檔案包含其他檔案,這些檔案包含完整的JSP頁面或JSP頁面的片段。JSP頁面片段的原始檔的推薦副檔名是.jspf。


jsp指令

JSP指令用來設定整個JSP頁面相關的屬性,如網頁的編碼方式和指令碼語言。

JSP中的三種指令標籤:

<%@ page ... %> 定義網頁依賴屬性,比如指令碼語言、error頁面、快取需求等等
<%@ include ... %> 包含其他檔案
<%@ taglib ... %> 引入標籤庫的定義

 

其他資訊訪問http://www.runoob.com/jsp/jsp-directives.html


JSP 生命週期

當請求對映到JSP頁面時,Web容器首先檢查JSP頁面的servlet是否比JSP頁面舊。如果servlet較舊,則Web容器將JSP頁面轉換為servlet類並編譯該類。在開發過程中,JSP頁面優於servlet的一個優點是構建過程是自動執行的。

  • 編譯階段:

    servlet容器編譯servlet原始檔,生成servlet類

  • 初始化階段:

    載入與JSP對應的servlet類,建立其例項,並呼叫它的初始化方法

  • 執行階段:

    呼叫與JSP對應的servlet例項的服務方法

  • 銷燬階段:呼叫與JSP對應的servlet例項的銷燬方法,然後銷燬servlet例項

轉換和編譯

在jsp轉換servlet階段,JSP頁面中的每種型別的資料都被區別對待。靜態資料轉換為程式碼這會將資料傳送到響應流中。JSP元素的處理如下:

  • 指令用於控制Web容器如何轉換和執行JSP頁面。
  • 指令碼元素被插入到JSP頁面的servlet類中。
  • 表示式語言表示式作為引數傳遞給JSP表示式求值程式
  • jsp:[set | get]屬性元素被轉換為對JavaBeans元件的get和set方法.
  • jsp:[include | forward]元素被轉換為Java Servlet API
  • jsp:plugin元素被轉換為特定於瀏覽器的標記,用於啟用applet。
  • 自定義標記將轉換為對實現自定義標記的標記處理程式的呼叫。

在Application Server中,基於JSP頁面建立的servlet原始碼位於/WAR-NAME/資料夾下,例如,建立一個名為index.jsp檔案,其編譯後的原始碼將命名為:

index_jsp.java

轉換和編譯階段都可能產生僅在第一次請求頁面時才會出現的錯誤。如果在任一階段遇到錯誤,伺服器將返回JasperException以及包含JSP頁面名稱和發生錯誤的行的訊息。

頁面轉換和編譯後,JSP頁面的servlet(大部分)遵循Servlet生命週期中描述的servlet生命週期:

  1. 如果JSP頁面的servlet例項不存在,則容器:
    1. 載入JSP頁面的servlet類
    2. 例項化servlet類的例項
    3. 通過呼叫jspInit方法初始化servlet例項
  2. 容器呼叫_jspService方法,傳遞請求和響應物件。
  3. 如果容器需要刪除JSP頁面的servlet,則它會呼叫jspDestroy方法。

執行

執行階段將執行轉換為servlet的jsp檔案,jsp指令則設定個如何去執行整個jsp頁面,除了上面的三種指令外還有其他的一些指令本文會一一介紹

緩衝指令

下列指令中buffer屬性的值可以是兩種形式,“none” 或者 緩衝區的大小(單位為KB),較大的緩衝區允許伺服器向客戶端響應之前向伺服器緩衝區寫入更多內容,從而為JSP頁面提供更多時間來設定適當的狀態程式碼和標題或轉發到另一個Web資源。較小的緩衝區會降低伺服器記憶體負載,並允許客戶端更快地開始接收資料。

<%@ page buffer="none|xxxkb" %>

 

JSP頁面錯誤指令

執行JSP頁面時可能會出現任意數量的異常。要指定Web容器應在發生異常時將控制轉發到錯誤頁面,請在JSP頁面的開頭包含以下頁面指令:

<%@ page errorPage="file-name" %>

例如,我們可以建立一個index.jsp頁面,並新增如下內容:

<%@ page errorPage="errorpage.jsp"%>

並建立一個errorPage.jsp的頁面,新增如下內容:

<%@ page isErrorPage="true" %>

${pageContext.errorData.throwable.cause} 
${pageContext.errorData.statusCode}

index.jsp頁面中的errorPage屬性聲明瞭jsp頁面發生錯誤時顯示的頁面“errorpage.jsp”,而errorPage.jsp頁面的isErrorPage屬性

聲明瞭errorPage頁面是否是一個jsp錯誤頁面,當我們的jsp執行出現錯誤時jsp將會進行跳轉,並直接跳轉到errorPage.jsp頁面,

而${pageContext.errorData.statusCode}用來獲取頁面的狀態碼比如404,500等,${pageContext.errorData.throwable.cause}用來顯示頁面的錯誤資訊

 

建立靜態內容

您可以在JSP頁面中建立靜態內容,只需編寫它就像建立僅包含該內容的頁面一樣。靜態內容可以用任何基於文字的格式表示,例如HTML,無線標記語言(WML)和XML。預設格式為HTML。如果要使用HTML以外的格式,請在JSP頁面的開頭新增一個page指令,其contentType屬性設定為內容型別。contentType指令的目的是允許瀏覽器正確解釋生成的內容。因此,如果您希望頁面包含以XML表示的資料,則應包含以下指令:

 

<%@ page contentType="text/XML"%>

響應和頁面編碼

當你需要為響應的內容設定編碼型別時,你可以使用以下指令:

<%@ page contentType="text/html; charset=UTF-8" %>

如果未設定響應編碼,獲取響應引數時會出現亂碼。

要設定JSP頁面本身的源編碼格式,您可以使用以下頁面指令:

<%@ page pageEncoding="UTF-8" %>

建立動態Content

共享物件

如果你希望JSP頁面以多執行緒的方式執行你可以使用以下指令:

<%@ page isThreadSafe="true|false" %>

當isThreadSafe屬性設定為true時,Web容器可以選擇將多個併發客戶端請求分派給JSP頁面。如果isThreadSafe設定為false,則按接收順序一次排程一個請求,並且不必控制對頁面級物件的訪問。