Java Servlet和JSP教程(12)(轉)

post0發表於2007-08-11
Java Servlet和JSP教程(12)(轉)[@more@]

[b]此篇是本站CnJSP小組核心成員鈍刀原創作品[/b]

12 JSP基礎內容及指令

12.1 JSP指令碼元素

JSP指令碼元素用來插入Java程式碼,這些Java程式碼將出現在由當前JSP頁面生成的Servlet中。指令碼元素有三種格式:

表示式格式:計算表示式並輸出其結果。

Scriptlet格式:把程式碼插入到Servlet的service方法。

宣告格式:把宣告加入到Servlet類(在任何方法之外)。

下面我們詳細說明它們的用法。

12.1.1 JSP表示式

JSP表示式用來把Java資料直接插入到輸出。其語法如下:

計算Java表示式得到的結果被轉換成字串,然後插入到頁面?撲閽讜誦惺苯?校ㄒ趁奼磺肭笫保??虼絲梢苑夢屎頹肭笥洩氐娜?啃畔?@?紓?旅嫻拇?胂允疽趁奼磺肭蟮娜掌?時間:

Current time:

為簡化這些表示式,JSP預定義了一組可以直接使用的物件變數。後面我們將詳細介紹這些隱含宣告的物件,但對於JSP表示式來說,最重要的幾個物件及其型別如下:

request:HttpServletRequest;

response:HttpServletResponse;

session:和request關聯的HttpSession

out:PrintWriter(帶緩衝的版本,JspWriter),用來把輸出傳送到客戶端

下面是一個例子:

Your hostname:

最後,如果使用XML的話,JSP表示式也可以寫成下面這種形式:

Java Expression

請記住XML元素和HTML不一樣。XML是大小寫敏感的,因此務必使用小寫。有關XML語法的說明,請參見《XML教程 》

12.1.2 JSP Scriptlet

如果你要完成的任務比插入簡單的表示式更加複雜,可以使用JSP Scriptlet。JSP Scriptlet允許你把任意的Java程式碼插入Servlet。JSP Scriptlet語法如下:

和JSP表示式一樣,Scriptlet也可以訪問所有預定義的變數。例如,如果你要向結果頁面輸出內容,可以使用out變數:

String queryData = request.getQueryString();

out.println("Attached GET data: " + queryData);

%>

注意Scriptlet中的程式碼將被照搬到Servlet內,而Scriptlet前面和後面的靜態HTML(模板文字)將被轉換成println語句。這就意味著,Scriptlet內的Java語句並非一定要是完整的,沒有關閉的塊將影響Scriptlet外的靜態HTML。例如,下面的JSP片斷混合了模板文字和Scriptlet:

Have a nice day!

Have a lousy day!

上述JSP程式碼將被轉換成如下Servlet程式碼:

if (Math.random() < 0.5) {

out.println("Have a nice day!");

} else {

out.println("Have a lousy day!");

}

如果要在Scriptlet內部使用字元“%>”,必須寫成“%>”。另外,請注意的XML等價表達是:

Code

12.1.3 JSP宣告

JSP宣告用來定義插入Servlet類的方法和成員變數,其語法如下:

由於宣告不會有任何輸出,因此它們往往和JSP表示式或Scriptlet結合在一起使用。例如,下面的JSP程式碼片斷輸出自從伺服器啟動(或Servlet類被改動並重新裝載以來)當前頁面被請求的次數:

自從伺服器啟動以來頁面訪問次數為:

和Scriptlet一樣,如果要使用字串“%>”,必須使用“%>”代替。最後,的XML等價表達方式為:

Code

12.2 JSP指令

JSP指令影響Servlet類的整體結構,它的語法一般如下:

另外,也可以把同一指令的多個屬性結合起來,例如:

attribute2="value2"

...

attributeN="valueN" %>

JSP 指令分為兩種型別:第一是page指令,用來完成下面這類任務:匯入指定的類,自定義Servlet的超類,等等;第二是include指令,用來在 JSP檔案轉換成Servlet時引入其他檔案。JSP規範也提到了taglib指令,其目的是讓JSP開發者能夠自己定義標記,但JSP 1.0不支援該指令,有希望它將成為JSP 1.1的主要改進之一。

12.2.1 page指令

page指令的作用是定義下面一個或多個屬性,這些屬性大小寫敏感。

import="package.class",或者import="package.class1,...,package.classN":

用於指定匯入哪些包,例如:。import是唯一允許出現一次以上的屬性。

contentType="MIME-Type" 或contentType="MIME-Type; charset=Character-Set":

該屬性指定輸出的MIME型別。預設是text/html。例如,下面這個指令:

和下面的Scriptlet效果相同:

isThreadSafe="true|false"

預設值true表明Servlet按照標準的方式處理,即假定開發者已經同步對例項變數的訪問,由單個Servlet例項同時地處理多個請求。如果取值 false,表明Servlet應該實現SingleThreadModel,請求或者是逐個進入,或者多個並行的請求分別由不同的Servlet例項處理。

session="true|false"

預設值true表明預定義變數session(型別為 HttpSession)應該繫結到已有的會話,如果不存在已有的會話,則新建一個並繫結session變數。如果取值false,表明不會用到會話,試圖訪問變數session將導致JSP轉換成Servlet時出錯。

buffer="size kb|none"

該屬性指定JspWrite out的快取大小。預設值和伺服器有關,但至少應該是8 KB。

autoflush="true|false"

預設值true表明如果快取已滿則重新整理它。autoflush很少取false值,false值表示如果快取已滿則丟擲異常。如果buffer="none",autoflush不能取false值。

extends="package.class"

該屬性指出將要生成的Servlet使用哪個超類。使用該屬性應當十分小心,因為伺服器可能已經在用自定義的超類。

info="message"

該屬性定義一個可以透過getServletInfo方法提取的字串。

errorPage="url"

該屬性指定一個JSP頁面,所有未被當前頁面捕獲的異??篩靡趁媧?懟?

isErrorPage="true|false"

該屬性指示當前頁面是否可以作為另一JSP頁面的錯誤處理頁面。預設值false。

language="java"

該屬性用來指示所使用的語言。目前沒有必要關注這個屬性,因為預設的Java是當前唯一可用的語言。

定義指令的XML語法為:

例如,下面這個指令:

它的XML等價表達是:

12.2.2 include指令

include指令用於JSP頁面轉換成Servlet時引入其他檔案。該指令語法如下:

這裡所指定的URL是和發出引用指令的JSP頁面相對的URL,然而,與通常意義上的相對URL一樣,你可以利用以“/”開始的URL告訴系統把URL視為從Web伺服器根目錄開始。包含檔案的內容也是JSP程式碼,即包含檔案可以包含靜態HTML、指令碼元素、JSP指令和動作。

例如,許多網站的每個頁面都有一個小小的導航條。由於HTML框架存在不少問題,導航條往往用頁面頂端或左邊的一個表格製作,同一份HTML程式碼重複出現在整個網站的每個頁面上。include指令是實現該功能的非常理想的方法。使用include指令,開發者不必再把導航HTML程式碼複製到每個檔案中,從而可以更輕鬆地完成維護工作。

由於include指令是在JSP轉換成Servlet的時候引入檔案,因此如果導航條改變了,所有使用該導航條的JSP頁面都必須重新轉換成Servlet。如果導航條改動不頻繁,而且你希望包含操作具有儘可能好的效率,使用include指令是最好的選擇。然而,如果導航條改動非常頻繁,你可以使用jsp:include動作。jsp:include動作在出現對JSP頁面請求的時候才會引用指定的檔案,請參見本文後面的具體說明。

12.3 例項:指令碼元素和指令的應用

下面是一個使用JSP表示式、Scriptlet、宣告、指令的簡單例子。

JavaServer Pages

VLINK="#551A8B" ALINK="#FF0000">

JSP應用例項

下面是一些利用各種JSP功能生成的動態內容:

  • 表示式.

    你的主機名: .

  • JSP Scriptlet.

    request.getQueryString()); %>

  • 宣告(和表示式).

    伺服器啟動以來訪問次數:

  • 指令(和表示式).

    當前日期:

12.4 JSP預定義變數

為了簡化JSP表示式和Scriptlet的程式碼,JSP提供了8個預先定義的變數(或稱為隱含物件)。這些變數是request、response、out、session、application、config、pageContext和page。

12.4.1 request

這是和請求關聯的HttpServletRequest,透過它可以檢視請求引數(呼叫getParameter),請求型別(GET,POST, HEAD,等),以及請求的HTTP頭(Cookie,Referer,等)。嚴格說來,如果請求所用的是HTTP之外的其他協議,request可以是 ServletRequest的子類(而不是HttpServletRequest),但在實踐中幾乎不會用到。

12.4.2 response

這是和應答關聯的HttpServletResponse。注意,由於輸出流(參見下面的out)是帶緩衝的,因此,如果已經向客戶端傳送了輸出內容,普通Servlet不允許再設定HTTP狀態程式碼,但在JSP中卻是合法的。

12.4.3 out

這是用來向客戶端傳送內容的PrintWriter。然而,為了讓response物件更為實用,out是帶快取功能的PrintWriter,即JspWriter。JSP允許透過page指令的buffer屬性調整快取的大小,甚至允許關閉快取。

out一般只在Scriptlet內使用,這是因為JSP表示式是自動傳送到輸出流的,很少需要顯式地引用out。

12.4.4 session

這是和請求關聯的HttpSession物件。前面我們已經介紹過會話的自動建立,我們知道,即使不存在session引用,這個物件也是自動繫結的。但有一個例外,這就是如果你用page指令的session屬性關閉了會話,此時對session變數的引用將導致JSP頁面轉換成Servlet時出錯。

12.4.5 application

這是一個ServletContext,也可以透過getServletConfig().getContext()獲得。

12.4.6 config

這是當前頁面的ServletConfig物件。

12.4.7 pageContext

主要用來管理頁面的屬性。

12.4.8 page

它是this的同義詞,當前用處不大。它是為了Java不再是唯一的JSP程式語言而準備的佔位符。

JSP動作利用XML語法格式的標記來控制Servlet引擎的行為。利用JSP動作可以動態地插入檔案、重用JavaBean元件、把使用者重定向到另外的頁面、為Java外掛生成HTML程式碼。

JSP動作包括:

jsp:include:在頁面被請求的時候引入一個檔案。

jsp:useBean:尋找或者例項化一個JavaBean。

jsp:setProperty:設定JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉到一個新的頁面。

jsp:plugin:根據瀏覽器型別為Java外掛生成OBJECT或EMBED標記。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-946048/,如需轉載,請註明出處,否則將追究法律責任。

相關文章