在
JSP
頁面中,使用標(biāo)簽庫代替?zhèn)鹘y(tǒng)的
Java
片段語言來實(shí)現(xiàn)頁面的顯示邏輯已經(jīng)不是新技術(shù)了,然而,由自定義標(biāo)簽很容易造成重復(fù)定義和非標(biāo)準(zhǔn)的實(shí)現(xiàn)。鑒于此,出現(xiàn)了
JSTL
(
JSP Standard Tag Library
)。大多數(shù)
JSP
頁面邏輯提供了實(shí)現(xiàn)的
JSTL
技術(shù),該技術(shù)本身就是一個(gè)標(biāo)簽庫。
Sun
公司
Java
規(guī)范標(biāo)準(zhǔn)的
JSTL
由
apache jakarta
組織負(fù)責(zé)維護(hù)。作為開源的標(biāo)準(zhǔn)技術(shù),它一直在不斷地完善。
JSTL
的發(fā)布包有兩個(gè)版本:
Standard-1.0 Taglib
、
Standard-1.1 Taglib
,它們?cè)谑褂脮r(shí)是不同的。
q????????
Standard-1.0 Taglib
(
JSTL1.0
)支持
Servlet2.3
和
JSP1.2
規(guī)范,
Web
應(yīng)用服務(wù)器
Tomcat4
支持這些規(guī)范,而它的發(fā)布也在
Tomcat 4.1.24
測(cè)試通過了。
q????????
Standard-1.1 Taglib
(
JSTL1.1
)支持
Servlet2.4
和
JSP2.0
規(guī)范,
Web
應(yīng)用服務(wù)器
Tomcat5
支持這些規(guī)范,它的發(fā)布在
Tomcat 5.0.3
測(cè)試通過了。
在本章的介紹中,將以由
Sun
發(fā)布的
Standard-1.1 Taglib
標(biāo)簽庫為主,而
apache jakarta
組織發(fā)布的開源標(biāo)簽庫,可以從
http://jakarta.apache.org/taglibs/
找到所需要的幫助。
Sun
發(fā)布的標(biāo)準(zhǔn)
JSTL1.1
標(biāo)簽庫有以下幾個(gè)標(biāo)簽:
q????????
核心標(biāo)簽庫:包含
Web
應(yīng)用的常見工作,比如:循環(huán)、表達(dá)式賦值、基本輸入輸出等。
q????????
國(guó)際化標(biāo)簽庫:用來格式化顯示數(shù)據(jù)的工作,比如:對(duì)不同區(qū)域的日期格式化等。
q????????
數(shù)據(jù)庫標(biāo)簽庫:可以做訪問數(shù)據(jù)庫的工作。
q????????
XML
標(biāo)簽庫:用來訪問
XML
文件的工作,這是
JSTL
標(biāo)簽庫的一個(gè)特點(diǎn)。
q????????
函數(shù)標(biāo)簽庫:用來讀取已經(jīng)定義的某個(gè)函數(shù)。
此外,
JSTL
還提供了
EL
表達(dá)式語言(
Expression Language
)來進(jìn)行輔助的工作。
JSTL
標(biāo)簽
庫由標(biāo)簽庫和
EL
表達(dá)式語言兩個(gè)部分組成。
EL
在
JSTL 1.0
規(guī)范中被引入,當(dāng)時(shí)用來作為
Java
表達(dá)式來工作,而該表達(dá)式必須配合
JSTL
的標(biāo)簽庫才能得到需要的結(jié)果。
說明:在
JSTL 1.1
規(guī)范中,
JSP2.0
容器已經(jīng)能夠獨(dú)立的理解任何
EL
表達(dá)式。
EL
可以獨(dú)立出現(xiàn)在
JSP
頁面的任何角落。本文隨后的內(nèi)容將以
JSTL 1.1
規(guī)范作為介紹的重點(diǎn)。
EL
是從
JavaScript
腳本語言得到啟發(fā)的一種表達(dá)式語言,它借鑒了
JavaScript
多類型轉(zhuǎn)換無關(guān)性的特點(diǎn)。在使用
EL
從
scope
中得到參數(shù)時(shí)可以自動(dòng)轉(zhuǎn)換類型,因此對(duì)于類型的限制更加寬松。
Web
服務(wù)器對(duì)于
request
請(qǐng)求參數(shù)通常會(huì)以
String
類型來發(fā)送,在得到時(shí)使用的
Java
語言腳本就應(yīng)該是
request.getParameter(“XXX”)
,這樣的話,對(duì)于實(shí)際應(yīng)用還必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換。而
EL
就將用戶從這種類型轉(zhuǎn)換的繁瑣工作脫離出來,允許用戶直接使用
EL
表達(dá)式取得的值,而不用關(guān)心它是什么類型。
下面的示例就是一個(gè)
EL
表達(dá)式,見例
9.1
。
例
9.1
:簡(jiǎn)單
EL
表達(dá)式
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <body>
??? ${sampleValue + 1} <br>
? </body>
</html>
這個(gè)示例將在
JSP
頁面顯示為“
1
”,
EL
表達(dá)式必須以“
${XXX}
”來表示,其中“
XXX
”部分就是具體表達(dá)式內(nèi)容,“
${}
”將這個(gè)表達(dá)式內(nèi)容包含在其中作為
EL
表達(dá)式的定義。本示例可以在滿足
JSP2.0
規(guī)范的任何
Web
應(yīng)用服務(wù)器中使用。
一個(gè)
EL
表達(dá)式包含變量和操作符兩個(gè)內(nèi)容。任何存在于
JSP
作用范圍的
JavaBean
都可以被轉(zhuǎn)化成
EL
表達(dá)式來使用,它所包含的默認(rèn)變量如下:
1
.默認(rèn)變量
pageScope
、
requestScope
、
sessionScope
、
applicationScope
這
4
個(gè)默認(rèn)變量包含
Scope
作用范圍的參數(shù)集合,相當(dāng)于被保存在
java.util.Map
中的某個(gè)參數(shù)。下面看簡(jiǎn)單的示例
9.2
:
例
9.2
:使用
sessionScope
變量的
EL
表達(dá)式
<%request.getSession().setAttribute("sampleValue", new Integer(10));%>
${sessionScope.sampleValue}
取得保存在
Session
中參數(shù)的
sessionScope
變量的
EL
表達(dá)式,“
.
”是
property
訪問操作符,在這里表示從
Session
中取得“鍵”為“
sampleValue
”的參數(shù),并顯示出來。顯示結(jié)果為“
10
”。
2
.默認(rèn)變量
param
、
paramValues
這兩個(gè)默認(rèn)變量包含請(qǐng)求參數(shù)的集合,
param
表明請(qǐng)求包含的參數(shù)為單一控件,
paramValues
表明請(qǐng)求包含的參數(shù)為控件數(shù)組。下面看一個(gè)簡(jiǎn)單示例
9.3
:
例
9.3
:提交請(qǐng)求的頁面和接受的頁面
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <body>
?
???? <form action="SampleJsp.jsp">
??? <input type="text" name="sampleValue" value="10">
??? <input type="text" name="sampleValue" value="11">
??? <input type="text" name="sampleValue" value="12">
??? <input type="text" name="sampleSingleValue" value="SingleValue">
??? <input type="submit" value="Submit">
??? </form>
? </body>
</html>
在這個(gè)頁面中定義了兩組控件,控件名為“
sampleValue
”的是一套控件數(shù)組,控件名為“
sampleSingleValue
”的是單一控件,通過遞交將請(qǐng)求參數(shù)傳送到
SampleJsp.jsp
。
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <body>
??? ${paramValues.sampleValue[2]} <br>
??? ${param.sampleSingleValue} <br>
? </body>
</html>
這是請(qǐng)求轉(zhuǎn)發(fā)到的頁面,通過
EL
表達(dá)式的
paramValues
變量得到控件數(shù)組中最后一個(gè)控件的遞交參數(shù),通過
EL
表達(dá)式的
param
變量得到單一控件的遞交參數(shù)。控件數(shù)組參數(shù)的
EL
表達(dá)式使用“
[]
”來指定數(shù)組下標(biāo)。本示例將顯示控件數(shù)組中最后一個(gè)控件的值“
12
”和單一控件的值“
SingleValue
”。
3
.默認(rèn)變量
header
、
headerValues
這兩個(gè)默認(rèn)變量包含請(qǐng)求參數(shù)頭部信息的集合,
header
變量表示單一頭部信息,
headerValues
則表示數(shù)組型的頭部信息。
4
.默認(rèn)變量
cookie
包含所有請(qǐng)求的
cookie
集合,集合中的每個(gè)對(duì)象對(duì)應(yīng)
javax.servlet.http.Cookie
。
5
.默認(rèn)變量
initParam
包含所有應(yīng)用程序初始化參數(shù)的集合。
6
.默認(rèn)變量
pageContext
等價(jià)于
page
環(huán)境類
javax.servlet.jsp.PageContext
的實(shí)例,用來提供訪問不同的請(qǐng)求參數(shù)。
11
個(gè)默認(rèn)變量幾乎包含了
Web
應(yīng)用的所有基本操作,若一個(gè)表達(dá)式不使用這些變量而直接使用參數(shù)名,那么就采用就近原則。該表達(dá)式將使用最近取得的參數(shù)值。