書名: 從零開始學Java Web開發作者名: 孫更新等編著本章字數: 2821字更新時間: 2018-12-27 13:06:04
4.4 JSP中的編譯指令
JSP編譯指令是用來設置與JSP頁面編譯相關的屬性,通過它JSP頁面可以向服務器發送命令,按照它的意圖指導服務器執行動作,它不直接產生任何可視的輸出,只是指示服務器對JSP頁面需要做什么。而且所有的指令都只在當前的JSP頁面中有效。
JSP編譯指令的使用格式如下:
<%@ directive {attr=”value”} %>
在JSP中包含以下3種指令。
? page指令:<%@ page %>。
? include指令:<%@ include %>。
? taglib指令:<%@ taglib %>。
4.4.1 page指令
page指令用來定義JSP頁面的全局屬性,它描述了例如,指定頁面所使用的腳本語言、頁面中引入的包等與頁面相關的一些指示信息。它的作用域是它所在的JSP頁面及該頁面所包含的文件。page指令以“<%@page”為起始標記,以“%>”為結束標記。
page指令可以在一個JSP文件中多次、多處使用,但是其中的屬性卻只能使用一次(import屬性例外),重復的屬性設置將會覆蓋掉先前的設置。無論用戶把page指令放在JSP程序文件中的哪個地方,它的作用范圍都是覆蓋整個JSP頁面。不過,為了養成一個良好的編程習慣,也為了JSP程序的可讀性,建議最好還是把它放在JSP程序文件的頂部。
page指令的語法格式如下:
<%@page [ language="java" ] [ extends="package.class" ] [ import="{ package.class | package.* },……" ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ] [ autoFlush="true | false" ] [ isThreadSafe="true | false" ] [ info="text" ] [ errorpage="relativeURL" ] [ contentType="mimeType [;charset=characterSet]"|"text/html;charset=encodeType" ] [ isErrorpage="true | false" ] %>
語法格式中方括號的內容是page指令的屬性和屬性值,這些屬性都是可選的,它們描述了與頁面相關的指示信息。
? language="java"。language屬性告訴服務器在JSP頁面中將采用哪種語言,在JSP當前的規范中,Java是JSP唯一支持的語言,因此該屬性一般情況下省略不寫。
? extends="package.class"。JSP文件編譯后的結果是一個Java類,所以一個JSP文件可以繼承其他的Java類。這個屬性標明JSP編譯時需要繼承的Java類的完整類名,但是繼承父類的同時也會限制JSP的編譯能力。因此,實際開發中往往忽略這個屬性。
? import="{ package.class | package.* },……"。表示需要導入的Java包的列表,這些包的作用域與page指令的作用域相同。當在JSP頁面中導入多個Java包時,多個Java包需要用逗號隔開,此外,還可以在多個page指令中分別導入Java包。例如:
<%@ page import=” java.util.* ,java.sql.*” %>
與下面的代碼實現的功能是一樣的
<%@ page import=” java.util.*” %> <%@ page import=” java.sql.*” %>
說明
java.lang.*、javax.servlet. *、javax.servlet.jsp. *和javax.servlet.http. *這4個包已經默認在程序編譯時被導入,所以不用再次顯式地聲明了。
? session="true | false"。該屬性決定當前JSP文件是否需要管理用戶的會話級信息,這些信息可能來自多個網頁。屬性值的設定取決于客戶是否需要HTTP Session。如果為true,則啟用Session,同時還可以在<jsp:useBean>元素中定義scope=session,否則不能使用。該屬性值默認為true。
? buffer="none | 8Kb | sizekb"。buffer的大小以千字節為單位,它是out內置對象處理JSP頁面后在客戶端瀏覽器輸出時使用的緩沖區。定義的值不小于8KB。Buffer的默認值為8KB。
? autoFlush="true | false"。設置對buffer溢出時的處理方式。如果為false,一旦溢出將導致一個意外錯誤的發生。而且,如果用戶把buffer設置為none,那么就不能把autoFlush設置為false。此屬性默認設置為true。
? isThreadSafe="true | false"。設置JSP文件是否能使用多線程。如果為true,JSP能同時處理多個客戶的請求;如果設置為false,JSP一次就只能處理一個客戶請求。
? info="text"。設置一個插入到JSP頁面中的文本。可以使用servlet.getServletInfo()方法重新得到這個文本。默認則忽略。
? errorpage="relativeURL"。設置用于處理異常事件的JSP頁面。設置該項后,當運行JSP頁面出錯時JSP引擎會將頁面轉向處理異常事件的頁面。
? contentType="mimeType[ ;charset=characterSet]" | "text/htm l ;charset=encodeType"。該屬性負責定義JSP字符的編碼和JSP頁面響應的MIME類型。其中contentType參數指定http響應的頭部的Content-Type的值。客戶端的瀏覽器會根據page指令中的contentType屬性所指定的MIME類型設置來顯示JSP頁面的輸出內容。JSP默認的MIME類型是text/html。charset參數是可選的,它指定了JSP字符的編碼類型。客戶端的瀏覽器會根據page指令中的charset屬性所指定的字符編碼類型,采用相應的字符集來顯示JSP網頁的輸出字符。JSP默認的charset類型是ISO-8859-1。表4.5中列出了一些常見的charset字符集類型。
表4.5 常見的charset字符集類型

說明
不同的國家和地區都制定了各自的編碼方式,常用的漢字編碼方式有如下幾種:GB2312碼,中華人民共和國標準漢字信息交換用編碼,簡稱國標碼,是16位編碼;GBK碼,它是對GB2312的擴展,包含GB2312的字符集;BIG5碼,是臺灣地區采用的繁體中文的編碼方式。
? isErrorpage="true | false"。該屬性表明當前頁是否作為其他JSP頁面的出錯頁面的URL目標。如果作為其他頁面的出錯頁面的URL目標,則將isErrorpage設為true,否則設為false。該屬性的默認值為false。
【實例4-3】處理錯誤頁。
01 <%@ page language="java" errorPage="error.jsp" contentType="text/html;charset=GBK"%> 02 <% 03 int dividend=0; //聲明被除數變量 04 int divisor=0; //聲明除數變量 05 int result=0; //聲明除法運算結果變量 06 try { 07 result=dividend/divisor; //執行除數運算 08 } 09 catch(ArithmeticException zz) { 10 throw new ArithmeticException( "除數不能為零!" );//拋出異常 11 } 12 %>
【代碼說明】在實例4-3頁面中的第7行定義了除法操作,由于定義的除數divisor為零,因此該頁面在執行時將拋出異常,導致頁面無法正常顯示。但是在該頁面第1行的page指令中設置了errorpage屬性,因此JSP引擎會將頁面轉向處理異常事件的error.jsp頁面。
error.jsp頁面的具體代碼如下:
01 <%@page language="java"isErrorPage="true"contentType="text/html;charset=GBK"%> 02 當前頁面是出錯頁面:error.jsp<br> 03 <%out.print(exception.toString()); //顯示捕獲的異常對象信息%>

圖4.33 顯示出錯頁面
【代碼說明】該頁面中第1 行的page指令中設置了isErrorpage屬性為ture,表示該頁面可以充當其他頁面的出錯頁。
【運行結果】打開瀏覽器在其中輸入進行除法運算的頁面的URL地址后,將顯示如圖4.33所示的訪問頁面。
說明
圖4.33所示的瀏覽器中的地址欄里的頁面和瀏覽中顯示的頁面是不同的,這是因為跳轉到出錯頁時,瀏覽器中的URL地址是不會隨同發生改變的。
4.4.2 include指令
include指令用來在JSP文件中插入一個包含文本和代碼的文件。被包含的文件可以是JSP文件、HTML文件或文本文件。如果被包含的文件是JSP文件,則當JSP引擎編譯時,就要將被包含的JSP文件插入到include指令所在的位置一起編譯。如果被包含的文件是HTML文件或文本文件,則JSP引擎不對其進行編譯,直接將其內容插入到include指令所在的位置。這種包含是靜態包含,即包含和被包含的JSP文件被JSP引擎一起編譯。假如被包含的文件發生變化,那么包含的JSP頁面將被重新編譯。
include指令的語法格式如下:
<%@ include file="relativeURL" %>
include指令只有一個屬性file,用來指定所要包含的文件的相對路徑。如果路徑直接以文件名開頭,則指的是當前正在使用的JSP文件所在的路徑;如果路徑以“/”開頭,則要參照正在使用的JSP文件的上下文路徑。
include指令具體示例代碼如下;
<%@ include file="helloworld.jsp" %> <%@ include file="name.html" %> <%@ include file="/chap04/test.txt" %>
上述示例代碼中的“file="/chap04/test.txt "”表明所要包含的文件test.txt在當前使用的JSP文件同級路徑中的chap04目錄中。
說明
在使用該指令時需要注意,被包含的JSP文件中不能含有page指令。因為被包含的文件的全部內容將被插入到JSP文件中include指令所在的地方,將會同JSP文件中已有的同樣的指令發生沖突。
【實例4-4】include指令的應用。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <html> 03 <body> 04 include編譯指令測試<br> 05 <%@ include file="include.jsp"%> <%-- 使用include指令包含include.jsp頁面--%> 06 </body> 07 </html>
【代碼說明】在實例4-4頁面的第5行中使用include指令包含JSP頁面include.jsp。
include.jsp頁面的具體代碼如下:
01 <%@ page contentType="text/html;charset=ISO-8859-1"%> 02 <%! String str=" Here is include’s context!"; //聲明要顯示在頁面中的字符串對象%> 03 <% out.println(str+"<br>"); //將字符串顯示在頁面中%>
【代碼說明】在該頁面的第1行中使用了page指令,這樣當該頁面被包含到另一個JSP頁面中時,在包含頁面中就會出現兩個page指令,這將違反page指令的使用規則。
【運行結果】運行實例4-4的JSP頁面將顯示如圖4.34所示的出錯信息。如果將include.jsp頁面中的page指令去掉,再運行實例4-4的JSP頁面顯示如圖4.35所示的運行結果。

圖4.34 顯示page指令重復錯誤

圖4.35 使用include指令包含JSP頁面
4.4.3 taglib指令
taglib指令是當JSP頁面中引用了用戶自定義標簽時,用來聲明這些用戶自定義的標簽的。該指令指定標簽的前綴,同時也為標簽庫命名。JSP引擎使用taglib指令以確定在JSP中遇到用戶自定義標簽時要怎樣去做。
taglib指令的語法形式如下:
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
其屬性說明如下。
? uri屬性:一個URI(Uniform Resource Identifier,統一資源標識符)標識標簽庫描述符。該標簽庫描述符用來唯一地確定標簽庫的名字,并告訴JSP引擎在編譯JSP頁面時如何處理指定標簽庫中的標簽。
? prefix屬性:定義標簽中的前綴字符串。
JSP中的標簽是一個經常使用的技術,這里只是簡單地介紹了一下taglib指令的格式,該指令的具體使用將在本書的第10章中詳細介紹,到時讀者將會體會到JSP用戶自定義標簽的強大功能。
- Oracle SOA Governance 11g Implementation
- Practical Data Wrangling
- 基于LPC3250的嵌入式Linux系統開發
- ESP8266 Home Automation Projects
- Mastering Game Development with Unreal Engine 4(Second Edition)
- 中國戰略性新興產業研究與發展·智能制造裝備
- 精通LabVIEW程序設計
- Artificial Intelligence By Example
- 人工智能:智能人機交互
- 大數據素質讀本
- Hands-On Microservices with C#
- 工業機器人技術
- Microsoft Power BI Complete Reference
- 圖像傳感器應用技術
- Outlook時間管理秘笈