一、JSP運行原理:
當瀏覽器向Web應用伺服器請求一個JSP頁面時,Web應用伺服器將其轉換為一個Servlet檔案(即一個.Java檔案),然後將這個Java檔案編譯成一個位元組碼檔案(.class檔案),最後Web應用伺服器載入轉換後的Servlet執行個體,處理用戶端的請求,並返回HTML格式的響應回應給用戶端瀏覽器。
二、JSP頁面的組成:
JSP頁面由指令標識、HTML代碼、嵌入的Java指令碼程式以及注釋組成;其中JAVA指令碼程式是通過<%和%>來嵌入到HTML頁面中的。
三、JSP頁面的3種指令碼元素類型:運算式格式、小指令碼格式和聲明格式
- 運算式格式:用於頁面中直接調用Java運算式,從而都得到傳回值,其基本文法如:<%=Java運算式/變數%>
- 小指令碼格式:HTML中使用<%和%>來嵌入Java指令碼程式,從而進行相應的邏輯處理,基本文法下:<%…任意的Java代碼…%>
- JSP聲明格式:用來定義Java指令碼語言中使用到的變數或者方法,其基本文法如下:<%!…Java聲明…%>
四、JSP的3個指令元素:
包含了page、include和taglib3個指令元素,其定義方法為:<%指令名[…一個或者多個指令屬性…]
%>
- 頁面指令page:它用於對JSP檔案中的全域屬性進行設定,如JSP頁面的編碼、內容類型、引用的類庫等。舉例如下:
<%@ page import="java.text.SimpleDateFormat"%><br /><%@ page language="java" contentType="text/html; charset=UTF-8"<br />pageEncoding="UTF-8"%><br />
注意:pageEncoding屬性和contentType屬性的區別
通常兩者同時存在,pageEncoding屬性的作用是指定JSP頁面的編碼格式,若其值非UTF-8,則頁面上的中文將會是亂碼;而contentType屬性的作用是指定伺服器出請求完成後回應給瀏覽器的內容類型,若其值設為”text/html;charset=utf-8”,說明伺服器回應的頁面是HTML文檔或常值內容,其字元集為支援中文的UTF-8。
- 檔案包含指令include:include指令用於引用頁面外部的檔案,可以將一個JSP頁麵包含到另一個JSP頁面中,從而實現JSP頁面重用。其指令的文法格式為:<%@include
file="path"%> ;其中path為引用檔案的路徑
注意:使用include指令最終將產生一個檔案,所以在被包含和包含的檔案中,不能有相同名稱的變數,否則會發生編譯錯誤。
技巧:通常情況下,一個網站頁面頭部(banner)與頁面底部都是相同的,可以分別建立這兩個頁面,在通過include指令將其包含在其他頁面中,從而減少代碼冗餘。
- 引用標籤庫指令taglib:用來引用一個標籤庫或者自訂標籤。通過taglib指令可以告訴容器此JSP頁面將使用哪些標籤庫,並可以給引用的標籤庫指定一個首碼。在JSP頁面中使用標籤庫可以簡化JSP頁面並減少使用Java代碼。常用的標籤庫有JSTL、Sturs標籤、Spring標籤等。taglib指令的文法格式為:<%@taglib
prefix="tagPrefix"uri=”tagURL”%> ;其中Prefix:指定標籤庫的首碼;uri=指定標籤庫檔案的位置;
例子:使用taglib指令引用標準標籤庫(JSTL)
<%@ taglib prefix="sql" uri=”http://java.sun.com/jsp/jstl/sql” %><br /><sql:query var=”book”><br />Select*from books<br /></sql:query><br />
五、JSP標準動作元素:
JSP標準動作元素的使用格式為:<jsp:標記名>,它採用嚴格的XML標籤文法來表示。這些JSP標籤動作元素是在使用者要求階段執行的(JSP執行的3個階段之一)。這些標準動作元素是內建在JSP檔案中的,可不需要引用,直接使用。
根據各個標準動作的功能,可將它們分成6組:
- JSP中使用到JavaBean的標準動作:<jsp:useBean>定義JSP頁面使用一個JavaBean執行個體,ID屬性定義了一個執行個體名稱;<jsp:getProperty>從一個JavaBean中擷取一個屬性值,並將其添加到響應中;<jsp:setProperty>設定一個JavaBean中的屬性值;
- 在JSP中包含其他JSP檔案或者Web資源的標準動作:<jsp:include>在請求處理階段包含來自一個Servlet或者JSP檔案的響應,注意與include指令的不同;
- 將到達的請求轉寄給另外一個JSP頁面或者Web資源以便進一步操作的標準動作:<jsp:forward>將某個請求的處理轉寄到另一個Servlet或者JSP頁面;
- 在其他標準動作的中間指定參數的標準動作:<jsp:param>對使用<jsp:include>或者<jsp:forward>傳遞到另外一個Servlet或者JSP頁面的請求添加一個傳遞參數值;
- 在用戶端的頁面中嵌入Java對象(例如applet,是運行在用戶端的小Java程式)的標準動作:<jsp:plugin>根據瀏覽器類型為Java外掛程式產生Object或者Embed標記;<jsp:params>,<jsp:fallback>;
- 僅僅英語標記檔案的標準動作:<jsp:attribute>,<jsp:body>,<jsp:invoke>,<jsp:dobody>,<jsp:element>,<jsp:text>,<jsp:output>。
常用的標準動作的功能簡述:
- <jsp:useBean>:定義JSP頁面使用一個JavaBean執行個體;
- <jsp:setProperty>:設定一個JavaBean中的屬性值;
- <jsp:getProperty>:擷取一個JavaBean中的屬性值;
- <jsp:include>:在JSP頁麵包含一個外在檔案;
- <jsp:forward>:把到達的請求轉交另一個頁面進行處理;
- <jsp:param>:用於傳遞參數值;
- <jsp:plugin>:用於指定在用戶端瀏覽器中插入外掛程式的屬性;
- <jsp:params>:用於向HTML頁面上的外掛程式外掛程式傳遞參數值;
- <jsp:fallback>:指定如何處理客戶不支援外掛程式啟動並執行情況;
補充:JSP執行的3個階段
- 被翻譯階段:編寫好的JSP檔案首先會被Web容器(在伺服器端)中的JSP引擎轉換成Java原始碼;
- 被編譯階段:Java原始碼會被編譯成二進位格式的可執行檔位元組碼;
- 要求階段:當容易接受了用戶端的請求後,就執行前面已經編譯策劃那個二進位位元組碼的JSP檔案。處理完請求後,容器再把產生的頁面反饋給用戶端進行顯示。
區別:認識include指令與<jsp:include>動作表示的本質區別
- include指令通過file屬性指定被包含的檔案,且file屬性不支援運算式;而<jsp:include>動作標識通過page屬性指定被包含的檔案,而且page屬性支援JSP運算式;
- 使用include指令時,被包含的檔案內容會原封不動的被插入到包含頁面中,然後JSP編譯器在將合成後的檔案最終編譯成一個Java檔案;而使用<jsp:include>動作標識執行時,程式會將請求轉寄到被包含頁面,並將執行結果輸出到瀏覽器中,然後返回包含頁繼續執行後面的代碼。
- 在應用include指令包含檔案時,由於被包含的檔案最終會產生一個檔案,所以在被包含檔案、包含檔案中不能有重名變數或方法;而在使用<jsp:include>動作標識包含檔案時,由於每個檔案是單獨編譯的,所以被包含檔案和包含檔案中重名的變數和方法是不衝突的。