JSP | 指令詳解以及實例


原作者為 RioTian@cnblogs, 本作品采用 CC 4.0 BY 進行許可,轉載請注明出處。

本篇學習自:C語言中文網,部分內容轉載僅供學習使用。

前文

JSP 中有一個關鍵的知識點:指令;

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

而JSP 引擎會根據 JSP 的指令信息來編譯 JSP,生成 Java 文件。在生成的 Java 文件中,指令就不存在了。

關於生成的 Java 文件在 Tomcat 文件夾中的 work 子文件夾中查看了。

相關博客:Tomcat 的文件結構

一般都會把 JSP 指令放到 JSP 文件的最上方,但這不是必須的。

指令通常以<%@標記開始,以%>標記結束,它的具體語法如下:

<%@ 指令名稱 屬性1="屬性值1" 屬性2="屬性值2" ... 屬性n="屬性值n" %>

JSP 中三大指令,它們分別是 page、include 和 taglib,下表是對它們的簡要說明。

JSP 三大指令

指 明 說 明
page page 指令用於定義 JSP 頁面的各種屬性。page 是最復雜的一個指令,它的屬性很多,常用的屬性有 import、language、pageEncoding 等。
include 靜態包含指令,用於引入其它 JSP 文件。使用 include 指令引入的其它 JSP 文件,JSP 引擎將把這兩個 JSP 文件翻譯成一個 servlet,所以將 include 稱為靜態包含。
taglib 用於在 JSP 頁面中導入標簽庫(JSP 標准標簽庫、第三方標簽庫、自定義標簽庫)。

Page 指令

page 指令是頁面指令,可以定義在整個 JSP 頁面范圍有效的屬性和相關的功能。利用 page 指令,可以指定腳本語言,導入需要的類,指明輸出內容的類型,指定處理異常的錯誤頁面,以及指定頁面輸出緩存的大小,還可以一次設置多個屬性。

Page 指令的作用對 JSP 頁面全局有效,與其書寫位置無關,習慣性放置 JSP 頁面最前面。

PS:在 JSP 編譯時,自動調整至最前面。

page 指令的屬性如下:

<%@ page
[language="java"]
[contentType="mimeType[ ;charset=CHARSET ]"]
[import="{package.class|package.*},..."]
[info="text"]
[extends="package.class"]
[session="true|false"]
[errorPage="relativeURL"]
[isThreadSafe="true|false"]
[buffer="none|8kb|size kb"]
[autoFlush="true|false"]
[isThreadSafe="true|false"]
[isELIgnored="true|false"]
[page Encoding="CHARSET"]
%>

提示:

  1. 語法格式說明中的“[”和“]”符號括起來的內容表示可選項。
  2. 可以在一個頁面上使用多個 page 指令,其中的屬性只能使用一次(import 屬性除外)。

JSP page 指令將使用這些屬性的默認值來設置 JSP 頁面,下面介紹 page 指令的 13 個屬性。

(1) language 屬性:設置當前頁面中編寫 JSP 腳本所使用的語言,默認值為 java。

例如:

<%@ page language="java" %>

目前只可以使用 Java 語言。

(2) contenType 屬性:設置發送到客戶端文檔響應報頭的 MIME(Multipurpose Internet MailExtention)類型和字符編碼,多個值之間用“;”分開。contenType 的用法如下:

<%@ page contenType="MIME 類型; charset=字符編碼" %>

MIME 類型被設置為 text/html,如果該屬性設置不正確,如設置為 text/css,則客戶端瀏覽器顯示 HTML 樣式時,不能對 HTML 標識進行解釋,而直接顯示 HTML 代碼。

在 JSP 頁面中,默認情況下設置的字符編碼為 ISO-8859-1,

contentType="text/html;charset=ISO-8859-1"。但一般情況下,應該將該屬性設置為

contentType="text/html;charset=utf-8"

此處設置 MIME 類型為 text/html,網頁所用字符集為 utf-8

(3) import 屬性:用來導入程序中要用到的包或類,可以有多個值,無論是 Java 核心包中自帶的類還是用戶自行編寫的類,都要在 import 中引入。import 屬性的用法如下:

<%@ page import="包名.類名" %>

如果想要導入包里的全部類,可以這樣使用:

<%@ page import="包名.*" %>

在 JSP page 指令中,可多次使用該屬性來導入多個類。例如:

<%@ page import="包名.類1" %> <%@ page import="包名.類2" %>

或者通過逗號間隔來導入多個類:

<%@ page import="包名.類1,包名.類2" %>

在 JSP 中,已經默認導入了以下包:

java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*

所以,即使沒有用 import 屬性進行導入,在 JSP 頁面中也可以調用上述包中的類。

【例1】顯示歡迎信息和用戶登錄的日期時間。

本例通過導入 java.util.Date 類來顯示當前的日期時間。具體步驟如下。

① 使用 page 指令的 import 屬性將 java.util.Date 類導入,然后向用戶顯示歡迎信息,並把當前日期時間顯示出來。具體代碼如下:

<%@ page import="java.util.Date" language="java" contentType="text/html;charset=utf-8"%><html><body>您好,歡迎光臨C語言中文網!<br/>您登錄的時間是<%=new Date()  %></body></html>

② 運行該頁面,結果如圖 1 所示。

圖1 顯示歡迎信息和用戶登錄的日期時間

(4) info 屬性:設置 JSP 頁面的相關信息,如當前頁面的作者、編寫時間等。此值可設置為任意字符串,由 Servlet.getServletInfo() 方法來獲取所設置的值。

【例2】設置並顯示 JSP 頁面的作者等相關信息。

本例通過 page 指令的 info 屬性來設置頁面的相關信息,通過 Servlet.getServletInfo() 方法來獲取所設置的值,具體步驟如下。

① 使用 page 指令的 info 屬性設置頁面的作者、版本以及編寫時間等。具體代碼如下:

<%@ page import="java.util.Date" language="java" contentType="text/html;charset=utf-8"%>
<%@ page info="作者:c.biancheng.net <br/> 版本: v1.0 <br/> 編寫時間:2018年11月21 星期三 <br/> 敬請關注, 謝謝!"%><html><body><%String str=this.getServletInfo();out.print (str) ;%></body><html>

② 運行該頁面,結果如圖 2 所示。

圖2 設置並顯示JSP頁面的作者相關信息

(5)extends 屬性:指定將 JSP 頁面轉換為 Servlet 后繼承的類。在 JSP 中,通常不會設置該屬性,JSP 容器會提供繼承的父類。並且,如果設置了該屬性,一些改動會影響 JSP 的編譯能力。

(6) session 屬性:表示當前頁面是否支持 session,如果為 false,則在 JSP 頁面中不能使用 session 對象以及 scope=session 的 JavaBean 或 EJB。該屬性的默認值為 true。

(7) errorPage 屬性:用於指定JSP文件的相對路徑,在頁面出錯時,將轉到這個 JSP 文件來進行處理。與此相適應,需要將這個 JSP 文件的 isErrorPage 屬性設為 true。

設置 errorPage 屬性后,JSP 網頁中的異常仍然會產生,只不過此時捕捉到的異常將不由當前網頁進行處理,而是由 errorPage 屬性所指定的網頁進行處理。如果該屬性值設置為以“/”開頭的路徑,則錯誤處理頁面在當前應用程序的根目錄下;否則在當前頁面所在的目錄下。

(8) isErrorPage 屬性:指示一個頁面是否為錯誤處理頁面。設置為 true 時,在這個 JSP 頁面中的內置對象 exception 將被定義,其值將被設定為調用此頁面的 JSP 頁面的錯誤對象,以處理該頁面所產生的錯誤。

isErrorPage 屬性的默認值為 false,此時不能使用內置對象 exception 來處理異常,否則將產生編譯錯誤。

例如,在發生異常的頁面上有如下用法:

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

用上面的代碼,就可以指明當該 JSP 頁面出現異常時,跳轉到 error.jsp 去處理異常。而在 error.jsp 中,需要使用下面的語句來說明可以進行錯誤處理:

<%@ page isErrorPage="true" %>

【例3】頁面出現異常的處理。

本例通過 page 指令的 errorPage 和 isErrorPage 兩個屬性來演示當頁面出現異常時應如何處理。具體步驟如下。

① 創建 2-18.jsp 頁面,使用 page 指令的 errorPage 屬性指定頁面出現異常時所轉向的頁面。具體代碼如下:

<%@ page contentType="text/html; charset=utf-8" errorPage="2-18error.jsp" %><html><body><%//此頁面如果發生異常,將向2-18error.jsp拋出異常,並令其進行處理int x1=5;int x2=0;int x3=x1/x2;out .print (x3);%></body></html>

該程序執行的是除法運算,如果除數為 0,將會拋出一個數學運算異常,從 errorPage="2-18error.jsp" 可以看出,程序指定 2-18error.jsp 為其處理異常。

② 創建 2-18error.jsp 頁面,使用 page 指令的 isErrorPage 屬性指定為出錯頁面,此頁面可以使用 exception 異常對象處理錯誤信息。具體代碼如下:

<%@ page contentType="text/html; charset=utf-8" isErrorPage="true" %><html><body>出現錯誤,錯誤如下:<br/><hr><%=exception.getMessage() %></body></html>

③ 運行 2-18.jsp 頁面,結果如圖 3 所示。

圖3 頁面出現異常處理

提示:

為了確譯當頁面出錯時跳轉到 errorPage 所指的頁面,需要打開 IE 瀏覽器,選擇“工具”→“Internet 選項”菜單命令,在彈出的對話框中選擇“高級”選項卡,取消選中“顯示友好 HTTP 錯誤信息”復選框。

(9) buffer 屬性:內置輸出流對象 out 負責將服務器的某些信息或運行結果發送到客戶端顯示,buffer 屬性用來指定 out 緩沖區的大小。其值可以是 none、8KB 或是給定的 KB 值。

值為 none 表示沒有緩存,直接輸出至客戶端的瀏覽器中;如果將該屬性指定為數值,則輸出緩沖區的大小不應小於該值,默認為 8KB(因不同的服務器而不同,但大多數情況下都為 8KB)。

(10) autoFlush 屬性:當緩沖區滿時,設置是否自動刷新緩沖區。默認值為 true,表示當緩沖區滿時,自動將其中的內容輸出到客戶端;如果設為 false,則當緩沖區滿時會出現 JSP Buffer overflow 溢出異常。

提示:

當 buffer 屬性的值設置為 none 時,autoFush 屬性的值不能設置為 false。

(11) isThreadSafe 屬性:設置 JSP 頁面是否可以多線程訪問。默認值為 true,表示當前 JSP 頁面被轉換為 Servlet 后,會以多線程的方式處理來自多個用戶的請求;如果設置為 false,則轉換后的 Servlet 會實現 SingleThreadMode 接口,並且將以單線程的方式來處理用戶請求。

(12) pageEncoding 屬性:設置 JSP 頁面字符的編碼,常見的編碼類型有 ISO-8859-1、gb2312、utf-8 和 GBK 等。默認值為 ISO-8859-1。其用法如下:

<%@ page pageEncoding="字符編碼" %>

例如:

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

這表示網頁使用了 utf-8 編碼,與 contentType 屬性中的字符編碼設置作用相同。

PS:一般 JSP 頁面顯示內容的編碼格式由 contentType 決定,而當頁面保存時調用 PageEncoding 的編碼保存。

(13) isELIgnored 屬性:其值可設置為 true 或 false,表示是否在此 JSP 網頁中執行或忽略表達式語言 ${}。設置為 true 時,JSP 容器將忽略表達式語言。

Include 指令

include 指令用於通知 JSP 引擎在翻譯當前 JSP 頁面時,將其他文件中的內容合並進當前 JSP 頁面轉換成的 Servlet 源文件中,這種在源文件級別進行引入的方式,稱為靜態引入,當前 JSP 頁面與靜態引入的文件緊密結合為一個 Servlet。這些文件可以是 JSP 頁面、HTML 頁面、文本文件或是一段 Java 代碼。其語法格式如下:

<%@ include file="relativeURL|absoluteURL" %>

說明如下:

(1) file 屬性指定被包含的文件,不支持任何表達式,例如下面是錯誤的用法:

<% String f="top.html"; %>
<%@ include file="<%=f %>" %>

(2) 不可以在 file 所指定的文件后接任何參數,如下用法也是錯誤的:

<%@ include file="top.jsp?name=zyf" %>

(3)如果 file 屬性值以“/”開頭,將在當前應用程序的根目錄下查找文件;如果是以文件名或文件夾名開頭,將在當前頁面所在的目錄下查找文件。

提示:

使用 include 指令是以靜態方式包含文件,也就是說,被包含文件將原封不動地插入 JSI 文件中,因此,在所包含的文件中不能使用 、 標記,否則會因為與原有的 JSP 文件有相同標記而產生錯誤。另外,因為原文件和被包含文件可以相互訪問彼此定義的變量和方法,所以要避免變量和方法在命名上產生沖突。

【例1】使用 include 指令標記靜態插入一個文本文件 Hello.txt,並在當前頁面同一個 Web 服務目錄中顯示“很高興認識你!Nice to meet you.”,具體操作步驟如下。

① Hello.txt 文本文件的代碼如下:

<%@ page contentType="text/html;charset=utf-8" %>
很高興認識你!
Nice to meet you.

② 創建 2-19.jsp 頁面,具體代碼如下:

<%@ page contentType="text/html;charset=utf-8" %>
<html><body bgcolor=cyan>
<H3><% include file="Hello.txt" %>
</H3>
</body>
</html>

JSP指令應用實例

編寫三個 JSP 頁面:first.jsp、second.jsp 和 third.jsp。另外,要求用“記事本”編寫一個 hello.txt 文件。

hello.txt 中的每行都有若干個英文單詞,這些單詞之間用空格分隔,每行之間用
分隔,如下所示:

package apple void back public<br>private throw class hello welcome

實訓步驟

(1) first.jsp 的具體要求。

first.jsp 使用 page 指令設置 contentType 屬性的值為 text/plain,使用 include 指令靜態插入 hello.txt 文件。first.jsp 的代碼如下:

<%@ page contentType="text/plain" %>
<html>
<body>
    <font Size=4 color=blue>
    <%@ include file="Hello.txt" %>
</body>
</html>

(2) second.jsp 的具體要求。

second.jsp 使用 page 指令設置 contentType 屬性的值為 application/vn.ms-powerpoint,使用 include 指令靜態插入 hello.txt 文件。second.jsp 的代碼如下:

<%@  page contentType="application/vnd.ms-powerpoint" %>
<html>
<body>
    <font Size=2 color=blue>
    <%@include file="Hello.txt"%>
</font>
</body>
</html>

(3) third.jsp 的具體要求。

third.jsp 使用 page 指令設置 contentType 屬性的值為 application/msword,使用 include 指令靜態插入 hello.txt 文件。third.jsp 的代碼如下:

<%@page contentType="application/msword" %>
<html>
<body>
<font Size=4 color=blue>
<%@include file="Hello.txt"%>
</font>
</body>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM