程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> jsp中page指令用法詳解

jsp中page指令用法詳解

編輯:關於JSP

本文實例講述了jsp中page指令用法。分享給大家供大家參考。具體如下:

一、JSP 指令

JSP 指令(directive)影響由 JSP 頁面生成的 servlet 的整體結構。下面的模板給出指令的兩種可能形式。屬性值兩邊的雙引號可以替換為單引號,但引號標記不能完全省略。如果要在屬性值中使用引號,則要在它們之前添加反斜槓,' 使用 \'," 使用 \"

<% directive attribute="value" %>
<% directive attribute1="value1"
attribute2="value2"
......
attribute3="value3" %>

在 JSP 中,主要有3種類型的指令:page,include 和 taglib。page 指令允許通過類的導入、servlet 超類的定制、內容類型的設置、以及諸如此類的事物來控制 servlet 的結構。page 指令可以放在文檔中的任何地方。第二個指令,include 允許在 JSP 文件轉換到 servlet 時,將一個文件插入到 JSP 頁面中。include 指令應該放 置在文檔中希望插入文件的地方。第三個指令,taglib,定義自 定義的標記標簽。

二、JSP page 指令

page 指令可以定義下面這些大小寫敏感的屬性(大致按照使用的頻率列出):import、contentType、pageEncoding、session、isELIgnored(只限 JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends。

2.1 import 屬性

使用 page 指令的 import 屬性指定 JSP 頁面轉換成的 servlet 應該輸入的包。在 JSP 中,包是絕對必需的。原因是,如果沒有使用包,系統則認為所引用的類與當前類在同一個包中。例如,假定一個 JSP 頁面包含下面的 scriptlet:
復制代碼 代碼如下:<% Test t=new Test(); %>

在此,如果 Test 在某個輸入包中,則沒有歧義。但是,如果 Test 不在包中,或者頁面沒有明確地導入 Test 所屬的包,那麼系統將會認為 Test 就在這個自動生成的 servlet 所在的包中。但問題是自動生成的 servlet 所在的包是未知的!服務器在創建 servlet 時,常常會根據 JSP 頁面所在的目錄來決定它的包。別的服務器可能使用其他不同的方式。因此,不能指望不使用包的類能夠正常工作。對於 bean 也同樣如此,因為 bean 不過是遵循某些簡單命名約定和結構約定的類。

默認情況下,servlet 導入 java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*,也許還包括一些服務器特有的包。編寫 JSP 代碼時,絕不要依靠任何自動導入的服務器特有類。這樣做會使得代碼不可移植。

使用 import 屬性時,可以采用下面兩種形式:

<%@ page import="package.class" %>
<%@ page import="package.class1, ..., package.classN" %>

例如,下面的指令表示 java.util 包和 cn.foololdfat 包中的所有類在使用時無需給出明確的包標識符:
復制代碼 代碼如下:<%@ page import="java.uti1.*, cn.foololdfat.*" %>

import 是 page 的屬性中惟一允許在同一文檔中多次出現的屬性。盡管 page 指令可以出現在文檔中的任何地方,但一般不是將 import 語句放在文檔頂部附近,就是放在相應的包首次使用之前。

2.2 contentType 和 pageEncoding 屬性

contentType 屬性設置 Content-Type 響應報頭,標明即將發送到客戶程序的文檔的 MIME 類型。有關MIME 類型的更多信息,參見Java Web 開發 (5) HTTP 響應報頭。

使用 contentType 屬性時,可以采用下面兩種形式:

<%@ page contentType="MIME-TYPE" %>
<%@ page contentType="MIME-Type; charset=Character-Set" %>

例如,指令
復制代碼 代碼如下:<%@ page contentType="application/vnd.ms-excel" %>

和下面的 scriptlet 所起到的作用基木相同
復制代碼 代碼如下:<% responce.setContentType("application/vnd.ms-excel"); %>

兩種形式的第一點不同是,response.setContentType 使用明確的 Java 代碼(這是一些開發人員力圖避免使用的方式),而 page 指令只用到 JSP 語法。第二點不同是,指令被特殊處理,它們不是在出現的位置直接成為 _jspService 代碼。這意味著 response.setContentType 能夠有條件地調用,而 page 指令不能。條件性地設置內容的類型主要用在同一內容能夠以多種不同的形式進行顯示的情況下。

不同於常規 servlet (默認的 MIME 類型為 text/plain),JSP 頁面的默認 MIME 類型是 text/html (默認字符集為 ISO-8859-1)。因此,如果 JSP 頁曲以 Latin 字符集輸出 HTML則根本無需使用 contentType,如果希望同時更改內容的類型和字符集,可以使用下面的語句:
復制代碼 代碼如下:<%@ page contentType="someMimeType; charset=someCharacterSet" %>

但是,如果只想更改字符集,使用 pageEncoding 屬性更為簡單。例如,中文 JSP 頁面可以使用下面的語句:
復制代碼 代碼如下:<%@ page pageEncoding="GBK" %>

可考慮將Java Web 開發 (5) HTTP 響應報頭中生成 Excel 表格的例子用 JSP 實現,以體會 contentType 的作用。
2.3 session 屬性
session 屬性控制頁面是否參與 HTTP 會話。使用這個屬性時,可以采用下面兩種形式:

<%@ page session="true" %> <%--Default--%>
<%@ page session="false" %>

true 值(默認)表示,如果存在已有會話,則預定義變量 session (類型為HttpSession)應該綁定到現有的會話;否則,創建新的會話並將其綁定到 session。false 值表示不自動創建會話,在 JSP 頁面轉換成 servlet 時,對變量 session 的訪問會導致錯誤。
對於高流量的網站,使用 session="false" 可以節省大量的服務器內存。但要注意,session="false" 並不禁用會話跟蹤,它只是阻止 JSP 頁面為那些尚不擁有會話的用戶創建新的會話。由於會話是針對用戶,不是針對貞面,所以,關閉某個頁面的會話跟蹤沒有任何益處,除非有可能在同一客戶會話中訪問到的相關頁面都關閉會話跟蹤。
2.4 isELIgnored 屬性
isELIgnored 屬性控制的是:忽略(true)JSP 2.0 表達式語言(EL),還是進行正常的求值(false)。這是 JSP 2.0 新引入的屬性;在只支持 JSP 1.2 及早期版本的服務器中,使用這項屬性是不合法的。這個屬性的默認值依賴於 Web 應用所使用的 web.xml 的版本。如果 web.xml 指定 servlet 2.3(對應JSP 1.2)或更早版本,默認值為 true(但變更默認值依舊是合法的,JSP 2.0 兼容的服務器中都允許使用這項屬性,不管 web.xml 的版本如何)。如果 web.xml 指定 servlet 2.4(對應 JSP 2.0)或之後的版本,那麼默認值為false。使用這個屬性時,可以采用下面兩種形式:

<%@ page isELIgnored="false" %>
<%@ page isELIgnored="true" %>

2.5 buffer 和 autoFlush 屬性
buffer 屬性指定 out 變量(類型為 JspWriter )使用的緩沖區的大小。使用這個屬性時,可以采用下面兩種形式:

<%@ page buffer="sizekb" %>
<%@ page buffer="none" %>

服務器實際使用的緩沖區可能比指定的更大,但不會小於指定的大小。例如,<%@ page buffer="32kb" %> 表示應該對文檔的內容進行緩存,除非累積至少為32KB、頁面完成或明確地對輸出執行清空(例如使用 response. flushBuffer),否則不將文檔發送給客戶。

默認的緩沖區大小與服務器相關,但至少8KB。如果要將緩沖功能關閉,應該十分小心:這樣做要求設置報頭或狀態代碼的 JSP 元素都要出現在文件的頂部,位於任何 HTML 內容之前。另一方面,有時輸出內容的每一行都需要較長的生成時間,此時禁用緩沖或使用小緩沖區會更有效率;這樣,用戶能夠在每一行生成之後立即看到它們,而不是等待更長的時間看到成組的行。

autoFlush 屬性控制當緩沖區充滿之後,是應該自動清空輸出緩沖區(默認),還是在緩沖區溢出後拋出一個異常(autoFlush="false")。使用這個屬性時,可以采用下面兩種形式:

<%@ page autoFlush="true" %> <%--Default--%>
<%@ page autoFlush="false" %>

在 buffer="none" 時,false 值是不合法的。如果客戶程序是常規的 Web 浏覽器,那麼 autoFlush="false" 的使用極為罕見。但是,如果客戶程序是定制應用程序,可能希望確保應用程序要麼接收到完整的消息,要麼根本沒有消息。false 值還可以用來捕獲產生過多數據的數據庫查詢,但是,一般說來,將這些邏輯放在數據訪問代碼中(而非表示代碼)要更好一些。

2.6 info 屬性

info 屬性定義一個可以在 servlet 中通過 getServletInfo 方法獲取的字符串,使用 info 屬性時,采用下面的形式:
復制代碼 代碼如下:<%@ page info="Some Message" %>

2.7 errorPage 和 isErrorPage 屬性

errorPage 屬性用來指定一個 JSP 頁面,由該頁面來處理當前頁面中拋出但未被捕獲的任何異常(即類型為 Throwable 的對象)。它的應用方式如下:
復制代碼 代碼如下:<%@ page errorPaqe="Relative URL" %>

指定的錯誤頁面可以通過 exception 變量訪問拋出的異常。
isErrorPage 屬性表示當前頁是否可以作為其他 JSP 頁面的錯誤頁面。使用 isErrorPage 屬性時,可以采用下面兩種形式:

<%@ page isErrorPage="true" %>
<%@ page isErrorPage="false" %> <%--Default--%>

2.8 isThreadSafe 屬性

isThreadSafe 屬性控制由 JSP 頁面生成的 servlet 是允許並行訪問(默認),還是同一時間不允許多個請求訪問單個 servlet 實例(isThreadSafe="false")。使用 isThreadSafe 屬性時,可以采用下面兩種形式:

<%@ page isThreadSafe="true" %> <%--Default--%>
<%@page isThreadSafe="false" %>

遺憾的是,阻止並發訪問的標准機制是實現 SingleThreadModel接口。盡管在早期推薦使用 SingleThreadModel 和 isThreadSafe="false",但最近的經驗表明 SingleThreadModel 的設計很差,使得它基本土毫無用處。因而,應該避免使用 isThreadSafe,采用顯式的同步措施取而代之。

2.9 extends 屬性

extends 屬性指定 JSP 頁面所生成的 servlet 的超類(superclass )。它采用下面的形式:
復制代碼 代碼如下:<%@ page extends="package.class" %>

這個屬性一般為開發人員或提供商保留,由他們對頁面的運作方式做出根本性的改變(如添加個性化特性)。一般人應該避免使用這個屬性,除非引用由服務器提供商專為這種目的提供的類。

2.10 language 屬性

從某種角度講,language 屬性的作用是指定頁面使用的腳本語言,如下所示:
復制代碼 代碼如下:<%@ page language="java" %>

就現在來說,由於 Java 既是默認選擇,也是惟一合法的選擇,所以沒必要再去關心這個屬性。

希望本文所述對大家的JSP程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved