JSP Page指令:頁面指令

2020-07-16 10:04:51
JSP Page 指令即頁面指令,利用頁面指令可以定義在整個 JSP 頁面範圍內有效的屬性,page 指令可以放在 JSP 頁面中的任意行,但習慣上放在檔案的開始部分,方便閱讀程式程式碼。Page 指令具有多種屬性,通過這些屬性的設定可以影響當前的 JSP 頁面。

例如,在頁面中正確設定當前頁面響應的MIME型別為 "text/html",如果 MIME 型別設定不正確,則當伺服器將資料傳輸給用戶端進行顯示時,用戶端將無法識別傳送的資料,從而不能正確地顯示內容。
Page 指令中包含許多的屬性。除 import 屬性外,其他屬性只能在指令中出現一次。

語法:

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

雖然 Page 指令具有如此多的屬性,但是在實際程式設計時,程式設計師並不需要一一列出。其中很多屬性可以忽略,此時 Page 指令將使用這些屬性的預設值來設定 JSP 頁面。

屬性說明
屬性 說明
autoFlush 該屬性預設值為 true,表示當緩衝區已滿時,自動將其中的內容輸出到用戶端。如果設為 false,則當緩衝區中的內容超出其設定的大小時,會產生 "JSP Buffer overflow" 溢位異常。
buffer 該屬性設定 out 物件(JspWriter 型別)使用的緩衝區的大小。若設定為 none,表示不使用快取,而直接通過 PrintWriter 物件進行輸出;如果將該屬性指定為數值,則輸出緩衝區的大小不應小於該值。預設值為 8KB(因伺服器的不同而不同,但大多數情況下都為 8KB)。
contentType 該屬性設定頁面響應的 MIME 型別,通常被設定為 text/html。
errorPage 該屬性用來指定一個當前頁面出現異常時所要呼叫的頁面。如果屬性值是以“/”開頭的路徑,則將在當前應用程式的根目錄下查詢檔案;否則,將在當前頁面的目錄下查詢檔案。
extends 該屬性用於指定一個 JSP 頁面轉換為 Servlet 後繼承的類。在 JSP 中通常不會設定該屬性,JSP 容器會提供轉換後的 Servlet 繼承的父類別。並且如果設定了該屬性,一些改動會影響 JSP 的編譯能力。
import  該屬性類似於 Java中 的 import 語句,用來向 JSP 檔案中匯入需要用到的包。
info 該屬性可設定為任意字串,如當前頁面的作者或其他有關的頁面資訊。可通過 Servlet.getServletInfo() 方法來獲取設定的字串。
isErrorPage 若將該屬性值設為 true,此時在當前頁面中可以使用 exception 異常物件。若在其他頁面中通過 errorPage 屬性指定了該頁面,則當呼叫頁面出現異常時,則會跳轉到該頁面,並且在該頁面中可通過 exception 物件輸出錯誤資訊。相反,如果將該屬性設定為 false,則在當前頁面中不能使用 exception 物件。該屬性預設值為 false。
isELIgnored 通過該屬性的設定,可以使 JSP 容器忽略表示式語言“${}”。其值只能為 true 或 false。設為 true,則忽略表示式語言。
isThreadSafe 該屬性預設值為 true,表示當前 JSP 頁面被轉換為 Servlet 後,會以多執行緒的方式來處理來自多個使用者的請求;如果設為 false,則轉換後的 Servlet 會實現 SigleThreadModel 介面,該 Servlet 將以單執行緒的方式來處理使用者請求,即其他請求必須等待直到前一個請求被處理結束。
language 該屬性用來設定當前頁面中編寫 JSP 指令碼使用的語言,預設值為 "java"。
pageEncoding 該屬性用來設定 JSP 頁面字元的編碼。預設值為 "ISO-8859-1"。
session Session 屬性的值用於設定是否需要使用伺服器內建的 session 物件,該屬性預設值為 true,表示當前頁面支援 session;設為false表示不支援 session。

範例1

本範例將 page 指令的 autoFlush 屬性設定為 true,此時如果緩衝區滿,就會自動地將緩衝區中的內容輸出到用戶端。關鍵程式碼如下:
<%@page autoFlush="true"%>


注意:若 buffer 屬性設為 none,則 autoFlush 不能設為 false。

範例2

本範例設定 buffer 屬性的值為 8KB,即將緩衝區的大小設定為 8KB,關鍵程式碼如下:
<%@page buffer="8kb"%>

範例3

如果類屬性設定不正確,如本範例設定為 "text/css",那麼用戶端瀏覽器在顯示 HTML 樣式時,就不能對 HTML 標記進行解釋,而顯示 HTML 程式碼,關鍵程式碼如下:
<%@page contentType="text/html"%>

範例4

在該屬性中還可以設定 JSP 字元的編碼,如本範例設定為 "gb2312",可以接受中文,關鍵程式碼如下:
<%@page contentType="text/html;charset=gb2312"%>

範例5

本範例設定 errorPage 屬性為 error.jsp,即將當前頁面出現的異常傳送到 error.jsp 頁面,關鍵程式碼如下:
<%@page errorPage="error.jsp"%>

範例6

本範例將屬性 extends 的值設為 "java.util.Date",即當前頁面轉換為 Servlet 後的繼承的類是 java.util.Date,關鍵程式碼如下:
<%@page extends="java.util.Date"%>

範例7

本範例在 Page 指令中可多次使用該屬性來匯入多個包,關鍵程式碼如下:
<%@page import="java.util.*"%>
<%@page import="java.text.*"%>
或者通過逗號間隔來匯入多個包,關鍵程式碼如下:
<%@page import="java.util.*,java.text.*"%>
在 JSP 中已經預設匯入了以下包:
  java.lang.*
  javax.servlet.*
  javax.servlet.jsp.*
  javax.servlet.http.*
所以,即使沒有通過 import 屬性設定,在 JSP 頁面中也可以呼叫上述包中的類。

若要在頁面中使用編寫的 JavaBeans,也可通過 import 屬性匯入。還可以通過 <jsp:useBean> 動作標籤來建立一個 JavaBean 範例進行呼叫。

範例8

本範例應用 info 屬性顯示頁面資訊,關鍵程式碼如下:
<%@page info="This is index.jsp!"%>
  <%=this.getServletInfo()%>
存取頁面後的結果是: 顯示頁面資訊: This is index.jsp

範例9

若當前應用下包含 index.jsp 和 error.jsp 檔案。在 index.jsp 頁面中進行資料的格式化操作,發生異常後將資訊顯示到 error.jsp 頁面,關鍵程式碼如下:
<%@page contentType="text/html;charset=gb2312"errorPage="error.jsp"%>
  <%
     String name="lzw";
     Integer.parseInt(name);  //將字串轉化為整型
   %>
上述程式碼將一個非數位格式的字串轉化為整型,因此將發生異常,最終進入 errorPage 屬性指定的 error.jsp 頁面顯示錯誤資訊。

在 error.jsp 頁面中需要將 isErrorPage 屬性設為 true,然後才能呼叫 exception 物件輸出錯誤資訊。error.jsp 頁面的程式碼如下:
<%@page contentType="text/html;charset=gb2312"isErrorPage="true"%>
出現錯誤!錯誤如下:
<%=exception.getMessage()%>
存取 index.jsp 頁面後,結果如下:
For input string: "lzw"

範例10

本範例應用 isELIgnored 屬性,設定其值為 false,表示不忽略表示式語言“${}”,關鍵程式碼如下:
<%@page isELIgnored="false"%>

範例11

本範例將 isTreadSafe 屬性設為 true,則當前頁面被轉換為 Servlet 後,會以多執行緒的方式處理來自使用者的請求,關鍵程式碼如下:
<%@page isThreadSafe="true"%>

範例12

本範例設定了當前頁面中使用 Java 語言來編寫 JSP 指令碼,並且目前只能是 Java 語言,關鍵程式碼如下:
<%@page language="java"%>

範例13

本範例是將頁面字元編碼的設定屬性設定為 "ISO-8859-1",那麼本頁面將不會支援中文格式的內容,關鍵程式碼如下:
<%@page pageEncoding="ISO-8859-1"%>

範例14

本範例將 session 屬性設定為 true,則表示可以使用伺服器內建的 session 物件,關鍵程式碼如下:
<%@page session="true"%>

典型應用

本範例通過應用 page 指令設定 contenType 屬性的值為 "image/jpeg",當存取 index.jsp 頁面時,用戶端的瀏覽器將啟動圖形解碼器來解析執行收到的資訊。程式碼如下:
<%@page language="java"import="java.util.*"pageEncoding="gb2312"%>
  <%@page contentType="image/jpeg"%>
    <%@page import="java.awt.*"%>
      <%@page import="java.io.*"%>
        <%@page import="java.awt.image.*"%>
          <%@page import="java.awt.geom.*"%>
            <%@page import="com.sun.image.codec.jpeg.*"%>
              <%int width=200,height=200;  //描述具有可存取影象資料緩衝區的Image
                    BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
                    Graphics g=image.getGraphics();
                    g.setColor(Color.white);
                    g.fillRect(0,0,width,height);
                    Graphics2D g_2d=(Graphics2D)g;  //以double精度定義橢圓
                    Ellipse2D ellipse=new Ellipse2D.Double(40,80,100,40);
                    g_2d.setColor(Color.blue);  //執行從2D坐標到其他2D坐標的線性對映
                    AffineTransform trans=new AffineTransform();
                    for(int i=1;i<=12;i++){
                       trans.rotate(30.0*Math.PI/180,90,100);
                       g_2d.setTransform(trans);
                       g_2d.draw(ellipse);
                       }
                    g.dispose();  //獲取指向用戶端的輸出流
                    OutputStream outClient=response.getOutputStream();
                    JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(outClient);
                    encoder.encode(image);
              %>