- JSP應用與開發技術(第3版)
- 馬建紅 李學相 韓穎 王瑞娟 張晗
- 3343字
- 2020-06-30 17:13:22
3.3 JSP指令元素
JSP的指令元素描述了JSP頁面轉換成JSP容器所能執行的Java代碼的控制信息,如JSP頁面所使用的語言、導入的Java類、網頁的編碼方式和指定錯誤處理頁面等。JSP的指令元素獨立于JSP頁面接受的任何請求,且不產生任何頁面輸出信息。
指令元素的語法格式如下:
<%@ 指令名 屬性1="值1" 屬性2="值2" …屬性n="值n"%>
例如,用戶常在每個JSP頁頭加上一個指定頁面語言和編碼方式的指令:
<%@ page language="java" contentType="text/html; charset=gb2312"%>
JSP中包括page、include和taglib三種指令。
3.3.1 page指令
page指令用來定義JSP頁面中的全局屬性,它描述與頁面相關的一些信息。page指令的位置一般在JSP頁面的開頭,放在其他位置也是可行的,在一個JSP頁面中可以有多個page指令。其語法格式如下:

page指令語法中各屬性的含義如下。
(1)language="java"
JSP中僅定義了一個language屬性值Java,表示腳本的語法必須符合Java語法規范。該屬性的默認值即為Java,所以可以不指定該屬性。
(2)extends="package.class"
標明JSP編譯時需要加入的Java Class的全名,但是得慎重使用,除非用戶對Java非常熟悉,因為它會限制JSP的編譯能力。
(3)import="{package.class | package.* },..."
import屬性用于導入JSP頁面中將要使用的Java類,一個import屬性導入一個或多個Java類的定義,中間用逗號分隔,例如:
<%@ page import="java.util.Vector, java.util.Calendar" %>
或
<%@ page import="java.util.Vector" %> <%@ page import="java.util.Calendar " %>
另外有些Java類是默認導入的,不需要用戶特別指定,例如:
java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*
(4)session="true | false"
設定客戶是否需要HTTP Session,如果它為true,那么session是有用的;如果它為false,那么用戶就不能使用session對象,以及定義scope=session的<jsp:useBean>元素。默認值是true。
例如:
<%@ page session="false" %> <%= session.getId() %>
由于session被設置為false,無法使用session對象,因此該實例代碼運行時將產生異常。
(5)buffer="none | 8kb | sizekb"
buffer的大小被out對象用于處理執行后的JSP對客戶瀏覽器的輸出,默認值是8KB。如果設置為none,則不使用緩沖區。
例如,設置頁面緩沖區的大小為64KB:
<%@ page buffer="64kb" %>
禁用緩沖區:
<%@ page buffer="none" %>
(6)autoFlush="true | false"
設置如果buffer溢出,是否需要強制輸出,如果其值被定義為true(默認值),輸出正常;如果它被設置為false,這個buffer溢出就會導致一個意外錯誤的發生。如果用戶把buffer設置為none,那么就不能把autoFlush設置為false。
(7)isThreadSafe="true | false"
設置JSP文件是否能多線程使用,默認值是true。也就是說,JSP能夠同時處理多個用戶的請求,如果設置為false,一個JSP一次只能處理一個請求。
(8)info="text"
一個文本在執行JSP時將會被逐字加入JSP中,能夠使用Servlet.getServletInfo方法取回。使用方法如下:
<%@ page info="要設置的字符串信息"%>
(9)errorPage="relativeURL"
設置處理異常事件的JSP文件。
(10)isErrorPage="true | false"
isErrorPage屬性設置此JSP頁面是否為錯誤處理頁面,默認值為false。如果設置為true,則表明在該頁面中可以獲取異常對象exception,并通過該對象取得從發生錯誤的頁面傳出的錯誤信息,獲取錯誤信息的常用方法如下:
<%=exception.getMessage()%>
(11)contentType="mimeType [ ;charset=characterSet ]" | "text/html
contentType屬性指定返回瀏覽器的內容類型,可用的屬性值有text/plain(純文本頁面)、text/html(純文本的HTML頁面)、text/xml(XML頁面)、applcation/x-msexcel(Excel文件)和application/msword(Word文件)等。contentType中可以同時指定返回頁面中所使用的字符編碼,如charset=gbk等。常用格式如下:
<%@ page contentType="text/html; charset=gb2312"%>
注意
無論把<%@ page %>指令放在JSP文件的哪個地方,它的作用范圍都是整個JSP頁面。不過,為了JSP程序的可讀性,以及養成良好的編程習慣,最好還是把它放在JSP文件的頂部。
下面通過幾個簡單的實例來設置page指令。
【例3-8】中文編碼示例(setCharset.jsp)。
contentType的設置對于JSP網頁的中文顯示有非常大的影響,JSP網頁默認的編碼方式并沒有辦法識別中文,因此用戶會發現網頁內容的中文部分將呈現亂碼。想要正常顯示中文,contentType屬性的charset項目必須設置為GB2312。
<html> <head> <title>演示page指令charset設置</title> </head> <body> <% out.println("Hello,歡迎使用JSP 2.x 技術 !! "); %> </body> </html>
在網頁開始的地方并沒有設置page指令,其執行結果如圖3-9所示。

圖3-9 setCharset.jsp執行結果
從瀏覽結果可以很明顯地看出,標題欄和網頁內容均呈現亂碼。下面將上述page指令的設置程序片段<%@ page contentType="text/html; charset=gb2312"%>加入網頁開始的地方。重新瀏覽網頁,這時中文部分已經能正常顯示,如圖3-10所示。

圖3-10 添加中文編碼后的網頁執行結果
contentType是網頁最常使用的指令,為了正常顯示中文,這個指令的設置是必要的。
【例3-9】setInfo.jsp簡單示范info屬性的設置方式。

程序代碼設置info屬性為說明字符串,再引用getServletInfo()方法,取得此說明字符串,并且將其輸出到網頁上,如圖3-11所示。

圖3-11 setInfo.jsp執行結果
【例3-10】出錯頁面pageError.jsp如何從error.jsp中獲取發生的錯誤信息。
pageError.jsp程序中設置了出錯處理頁面為errorPage="error.jsp",在頁面運行過程中一旦遇到異常,就自動跳轉到error.jsp中處理異常。在error.jsp中利用isErrorPage="true"將其設置為錯誤頁面,可以在該頁面中處理捕捉到的異常。
pageError.jsp程序代碼如下:

error.jsp代碼如下:

由于IE瀏覽器在出現錯誤時會將默認的錯誤頁面替代返回的錯誤頁面,因此必須先在IE中將該功能屏蔽才能看到運行效果。打開IE瀏覽器,然后在IE中選擇“工具”|“Internet選項”菜單命令,在彈出的“Internet選項”對話框中單擊打開“高級”選項卡,如圖3-12所示,取消選中“顯示友好HTTP錯誤信息”復選框,然后單擊“確定”按鈕,完成設置,運行效果如圖3-13所示。

圖3-12 屏蔽IE默認錯誤頁面的設置

圖3-13 出現異常的返回頁面
<%@ page %>指令作用于整個JSP頁面,同樣包括靜態的包含文件。但是<%@ page %>指令不能作用于動態的包含文件,如<jsp:include>。
可以在一個頁面中使用多個<%@ page %>指令,但是其中的屬性只能用一次,不過也有例外,那就是import屬性。因為import屬性和Java中的import語句類似(import語句引入的是Java語言中的類),所以此屬性就能多用幾次。
3.3.2 include指令
JSP中的include指令用來包含一個靜態的文件,在解析當前頁面時,這個文件中的代碼會被復制到當前頁面中。其語法格式如下:
<%@ include file="relative url" %>
其中,file="filename"這個被包含文件的路徑名一般來說是指相對路徑,不需要什么端口、協議和域名,例如"conn.jsp"、"/beans/calendar.jsp"等。如果路徑是以文件名或目錄名開頭,那么這個路徑就是正在使用的JSP文件的當前路徑;如果這個路徑以“/”開頭,那么這個路徑主要是參照JSP應用的上下關系路徑。
<%@ include %>指令將會在JSP程序代碼被編譯時,插入一個包含文本或者源代碼的文件一起進行編譯。使用<%@ include %>指令語句去包含某個文本或程序代碼文件的過程是靜態的,靜態包含的具體含義是指這個被包含的文件將會被完整地插入到原來的主JSP文件中去,這個由主JSP文件包含的文件可以是JSP文件、HTML文件、文本文件或者是一段Java代碼等。如果<%@ include %>指令包含的文件是JSP文件,則該JSP文件將會被主JSP文件一起編譯執行。
include指令將會在JSP編譯時插入一個文件,而這個包含過程是靜態的。所謂靜態的是指file屬性值不能是一個變量。例如,下面為file屬性賦值的方式是不合法的。
<%String url="header.htmlf";%> <%@include file="<%=url%>"%>
也不可以在file所指定的文件后添加任何參數,下面這行代碼也是不合法的。
<%@ include file="query.jsp?name=browser"%>
如果只是用include來包含一個靜態文件,那么這個包含的文件所執行的結果將會插入到JSP文件中放<% @ include %>的地方。一旦包含文件被執行,那么主JSP文件的過程將會被恢復,繼續執行下一行。但是要注意,在這個包含文件中不能使用<html>、</html>、<body>、</body>標記,因為這將會影響在原JSP文件中同樣的標記,有時會導致錯誤。
一旦引用了include指令,加載的外部文件內容將成為當前網頁的一部分。下面示范include指令操作。使用include指令有一點必須特別注意:當文件的內容包含中文時,Tomcat會顯示為亂碼;在外部文件中加入page指令,即可將中文正確顯示出來。
【例3-11】文件include.jsp中靜態包含了4個文件:HTML文件include_html.html、文本文件include_txt.txt、JSP文件include_jsp.jsp、JSP代碼include_code.cod。執行結果如圖3-14所示。

圖3-14 include.jsp中靜態包含了4個文件的執行結果
include.jsp代碼如下:
<%@ page contentType="text/html; charset=gb2312" language="java"%> <html> <head> <title>Include指令示例</title> </head> <body> <p>插入HTML文件:<%@ include file="include_html.html"%> <p>插入文本文件:<%@ include file="include_txt.txt"%> <p>插入JSP文件,顯示現在的日期時間:<%@include file="include_jsp.jsp"%> <p>插入JSP代碼:<%@ include file="include_code.cod"%> </body> </html>
include_html.html代碼如下:
<%@ page contentType="text/html; charset=gb2312" %> <font color=blue size=4> 這是插入的HTML文件 </font>
include_txt.txt代碼如下:
<%@ page contentType="text/html; charset=gb2312" %> <%="這是插入的文本文件"%>
include_jsp.jsp代碼如下:
<%@ page contentType="text/html; charset=gb2312"%> <%@ page import="java.util.*"%> <%=new Date().toString()%> <%="這是插入的JSP文件的內容"%>
include_code.code代碼如下:
<%@ page contentType="text/html; charset=gb2312" %> <% String s="這是插入執行代碼的內容"; out.print(s); %>
include指令只能加載指定的外部文件,而且不能進行傳遞參數操作,后面將要說明action element有一個與此類似的指令,可以突破這些限制。如果外部文件只包含單純的靜態內容,使用include指令是理所當然的選擇。include指令將會在JSP編譯時插入被包含文件的內容,被包含的文件內容常常是代碼片段,因此代碼片段的擴展名最好以f(fragment的第一個字母)結尾,例如,.htmlf、.jspf等。這么做的好處是避免JSP編輯器對該文件內容進行語法檢查。
【例3-12】文件static_include.jsp中靜態包含了兩個文件:header.htmlf和footer.jspf。執行結果如圖3-15所示。

圖3-15 static_include.jsp中靜態包含了2個文件的執行結果
static_include.jsp代碼如下:
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.Calendar" %> <%@ page import="java.text.SimpleDateFormat" %> <%@ include file="template/header.htmlf" %> <h3>本頁面使用include指令,導入了header.htmlf和footer.jspf</h3> <%@ include file="template/footer.jspf" %>
header.htmlf代碼如下:
<%@ page contentType="text/html; charset=GBK" %> <html> <head> <title> Include指令示例 </title> </head> <body> <hr>
footer.jspf代碼如下:
<%@ page contentType="text/html; charset=GBK" %> <hr> <% Calendar cal = Calendar.getInstance(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); %> <P align=center>今天:<%=formatter.format(cal.getTime())%> <hr> </body> </html>
使用include指令可以把一個復雜的JSP頁面分成若干簡單的部分,這樣大大增加了JSP頁面的管理性。當要對頁面進行更改時,只需要更改對應的部分就可以。
3.3.3 taglib指令
taglib指令用來定義一個標簽庫及其自定義標簽的前綴,其語法格式如下:
<%@ taglib uri=" tagLibraryURI" prefix=" tagPrefix" %>
其中,屬性uri(Uniform Resource Identifier,統一資源標識符)用來唯一地確定標簽庫的路徑,并告訴JSP引擎在編譯JSP程序時如何處理指定標簽庫中的標簽;屬性prefix定義了一個指示使用此標簽庫的前綴。例如:
<%@ taglib uri="http://www.jspcentral.com/tags" prefix="public" %> <public:loop> … </public:loop>
在上邊的代碼中,uri=http://www.jspcentral.com/tags說明了使用的標簽庫所在的路徑,<public:loop>說明了要使用public標簽庫中的loop標簽,如果這里不寫public,就是不合法的。定義標簽時,不能使用jsp、jspx、java、javax、servlet、sun和sunw作為前綴,這些前綴是JSP保留的。在使用自定義標簽之前必須使用<% @ taglib %>指令,并且可以在一個頁面中多次使用,但是前綴只能使用一次。