jsp中page指令用法詳解_JSP編程

來源:互聯網
上載者:User

本文執行個體講述了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 值是不合法的。如果客戶程式是常規的 網頁瀏覽器,那麼 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程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.