JavaWeb(七)JSP-2

1、JSP指令簡介

JSP指令(directive)是爲JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其餘部分。

JSP指令的基本語法格式:

<%@ 指令 屬性名="值" %>

舉例:<%@ page contentType="text/html;charset=gb2312"%>

注意:屬性名部分是大小寫敏感的

在目前的JSP 2.0中,定義了pageincludetaglib這三種指令,每種指令中又都定義了一些各自的屬性。


如果要在一個JSP頁面中設置同一條指令的多個屬性,可以使用多條指令語句單獨設置每個屬性,也可以使用同一條指令語句設置該指令的多個屬性。

第一種方式:


第二種方式:


2、Page指令

page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面,爲了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置

JSP 2.0規範中定義的page指令的完整語法:

①. import 屬性:指定當前 JSP 頁面對應的 Servlet 需要導入的類。 <%@page import="java.text.DateFormat"%>


②. session 屬性:取值爲 true 或 false,指定當前頁面的 session 隱藏變量是否可用, 也可以說訪問當前頁面時是否一定要生成 HttpSession對象。 <%@ page session="false" %>



③. errorPage 和 isErrorPage:

 > errorPage 指定若當前頁面出現錯誤的實際響應頁面是什麼。其中 / 表示的是當前 WEB 應用的根目錄. <%@ page errorPage="/error.jsp" %> 。在響應 error.jsp 時, JSP 引擎使用的請求轉發的方式。

> isErrorPage 指定當前頁面是否爲錯誤處理頁面, 可以說明當前頁面是否可以使用 exception 隱藏變量。需要注意的是:若指定 isErrorPage="true",並使用 exception 的方法了,一般不建議能夠直接訪問該頁面。 如何使客戶不能直接訪問某一個頁面呢 ? 對於 Tomcat 服務器而言,WEB-INF 下的文件是不能通過在瀏覽器中直接輸入地址的方式來訪問的。但通過請求的轉發是可以的。 還可以在 web.xml 文件中配置錯誤頁面:





④. contentType:指定當前 JSP 頁面的響應類型。 實際調用的是 response.setContentType("text/html; charset=UTF-8");通常情況下,對於 JSP 頁面而言其取值均爲 text/html; charset=UTF-8。 charset 指定返回的頁面的字符編碼是什麼,通常取值爲 UTF-8

⑤. pageEncoding: 指定當前 JSP 頁面的字符編碼。通常情況下該值和 contentType 中的 charset 一致。 

⑥. isELIgnored:指定當前 JSP 頁面是否可以忽略 EL 表達式。通常取值爲 false。

3、include指令

include指令用於通知JSP引擎在翻譯當前JSP頁面時將其他文件中的內容合併進當前JSP頁面轉換成的Servlet源文件中,這種在源文件級別進行引入的方式稱之爲靜態引入,當前JSP頁面與靜態引入的頁面緊密結合爲一個Servlet。

語法:

<%@ include file="relativeURL"%>

其中的file屬性用於指定被引入文件的相對路徑。 

細節:

(1)被引入的文件必須遵循JSP語法,其中的內容可以包含靜態HTML、JSP腳本元素、JSP指令和JSP行爲元素等普通JSP頁面所具有的一切內容。 

(2)被引入的文件可以使用任意的擴展名,即使其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它裏面的內容,爲了見明知意,JSP規範建議使用.jspf(JSP fragments)作爲靜態引入文件的擴展名。

(3)在將JSP文件翻譯成Servlet源文件時,JSP引擎將合併被引入的文件與當前JSP頁面中的指令元素(設置pageEncoding屬性的page指令除外),所以,除了import和pageEncoding屬性之外,page指令的其他屬性不能在這兩個頁面中有不同的設置值。




打開a_jsp.java,查看裏面的內容


然後在a.jsp中添加如下內容,注意一定要放在引入b.jsp的前面


在b.jsp中獲取



4、JSP標籤

JSP還提供了一種稱之爲Action的元素,在JSP頁面中使用Action元素可以完成各種通用的JSP頁面功能,也可以實現一些處理複雜業務邏輯的專用功能。

 Action元素採用XML元素的語法格式,即每個Action元素在JSP頁面中都以XML標籤的形式出現。

JSP規範中定義了一些標準的Action元素,這些元素的標籤名都以jsp作爲前綴,並且全部採用小寫,例如,<jsp:include>、<jsp:forward>、<jsp:param>等等。

5、<jsp:include>標籤

標籤用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入

page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。

flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。




查看a_jsp.java文件


6、<jsp:include>標籤與include指令的比較

(1)<jsp:include>標籤是在當前JSP頁面的執行期間插入被引入資源的輸出內容,當前JSP頁面與被動態引入的資源是兩個彼此獨立的執行實體,被動態引入的資源必須是一個能獨立被WEB容器調用和執行的資源。include指令只能引入遵循JSP格式的文件,被引入文件與當前JSP文件共同合被翻譯成一個Servlet的源文件。 

(2)使用<jsp:include>標籤和include指令都可以把一個頁面的內容分成多個組件來生成,開發者不必再把頁眉和頁腳部分的相同HTML代碼複製到每個JSP文件中,從而可以更輕鬆地完成維護工作,但是都應注意最終的輸出結果內容應遵循HTML語法結構,例如,如果當前頁面產生了<html>、</html>、<body>、</body>等標記,那麼在被引入文件中就不能再輸出<html>、</html>、<body>、</body>等標記。

(3)<jsp:include>標籤對JSP引擎翻譯JSP頁面的過程不起作用,它是在JSP頁面的執行期間才被調用,因此不會影響兩個頁面的編譯。由於include指令是在JSP引擎翻譯JSP頁面的過程中被解釋處理的,所以它對JSP引擎翻譯JSP頁面的過程起作用,如果多個JSP頁面中都要用到一些相同的聲明,那麼就可以把這些聲明語句放在一個單獨的文件中編寫,然後在每個JSP頁面中使用include指令將那個文件包含進來。

(4)<jsp:include>標籤使用page屬性指定被引入資源的相對路徑,而include指令使用file屬性指定被引入資源的相對路徑。

7、<jsp:forward>標籤

<jsp:forward>標籤用於把請求轉發給另外一個資源



相當於


8、<jsp:param>標籤

當使用<jsp:include>和<jsp:forward>標籤引入或將請求轉發給的資源是一個能動態執行的程序時,例如Servlet和JSP頁面,那麼,還可以使用<jsp:param>標籤向這個程序傳遞參數信息。




9、JSP中文亂碼

(1)在 JSP 頁面上輸入中文,請求頁面後不出現亂碼:保證 contentType="text/html; charset=UTF-8", pageEncoding="UTF-8" charset 和 pageEncoding 的編碼一致,且都支持中文。通常建議取值爲UTF-8, 還需保證瀏覽器的顯示的字符編碼也和請求的 JSP 頁面的編碼一致。

(2)獲取中文參數值: 默認參數在傳輸過程中使用的編碼爲 ISO-8859-1

①. 對於 POST 請求:只要在獲取請求信息之前(在調用 request.getParameter 或者是 request.getReader 等), 調用 request.setCharacterEncoding("UTF-8") 即可。

②. 對於 GET 請求:前面的方式對於 GET 無效;可以通過修改 Tomcat 的 server.xml 文件的方式。參照 http://localhost:8989/docs/config/index.html 文檔的 useBodyEncodingForURI 屬性. 爲 Connector 節點添加 useBodyEncodingForURI="true" 屬性即可。






關注公衆號:Java後端生活,乾貨文章第一時間送達!


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