官术网_书友最值得收藏!

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用戶自定義標簽的強大功能。

主站蜘蛛池模板: 元谋县| 布拖县| 元谋县| 金堂县| 沾化县| 彭水| 沛县| 荣成市| 清镇市| 略阳县| 张家港市| 高安市| 同德县| 松江区| 上林县| 民丰县| 法库县| 泰州市| 化州市| 鄂州市| 南澳县| 潮安县| 青神县| 湄潭县| 呈贡县| 玉林市| 黔江区| 望江县| 丰城市| 大化| 金乡县| 象山县| 简阳市| 桦甸市| 沾益县| 凤台县| 西和县| 唐河县| 尚志市| 红安县| 金沙县|