作者: ecsun 鏈接:http://papa.javaeye.com/blog/222688 發(fā)表時(shí)間: 2008年08月01日
聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!
JavaServer Pages Standard Tag Libray(1.1),其中文名字為JSP標(biāo)準(zhǔn)標(biāo)簽函數(shù)庫(kù)。JSTL是一個(gè)標(biāo)準(zhǔn)的已
制定好的標(biāo)簽庫(kù),可以應(yīng)用于各種領(lǐng)域,如:基本輸入輸出,流程控制,循環(huán),XML文件剖析,數(shù)據(jù)庫(kù)查
詢(xún)以及國(guó)際化和文字格式標(biāo)準(zhǔn)化的應(yīng)用等。JSTL所提供的標(biāo)簽庫(kù)分為以下五大類(lèi):
核心標(biāo)簽庫(kù)(Core tag Liabry)主要有:基本輸入輸出,流程控制,迭代操作和URL操作。
在JSP中使用JSTL中的標(biāo)簽庫(kù)時(shí),必須使用<%@taglib%>指令,并且設(shè)定prefix和uri的值得,通常設(shè)定:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
這樣就可以使用核心標(biāo)簽庫(kù)了。
.表達(dá)式操作
表達(dá)式操作分類(lèi)中包含四個(gè)標(biāo)簽: <c:out>,<c:set>,<c:remove>和<c:catch>
<c:out>:重要用來(lái)顯示數(shù)據(jù)的內(nèi)容,類(lèi)似與<%=scripting-language%>。它的語(yǔ)法如下:
語(yǔ)法1: 沒(méi)有body內(nèi)容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>
語(yǔ)法2: 有body內(nèi)容
<c:out value="value" [escapeXml="{true|false}"]>
default value
</c:out>
Attribute
-----------------------------------------------------------------------------------------------------------------------
名稱(chēng) 說(shuō)明 EL 類(lèi)型 必須 默認(rèn)值
value 需要顯示的值 Y Object 是 無(wú)
default 如果value值為null,則顯示default的值 Y Object 否 無(wú)
escapeXml 是否轉(zhuǎn)換特殊字符,如: <轉(zhuǎn)換為&It Y Object 否 true
----------------------------------------------------------------------------------------------------------------------
Null和錯(cuò)誤說(shuō)明
假若value為null,會(huì)顯示default的值;假若沒(méi)有設(shè)定default的值,則會(huì)顯示一個(gè)空的字符串。
<c:set>:主要用來(lái)把變量存儲(chǔ)至JSP范圍或是JavaBean的屬性中。
語(yǔ)法1: 沒(méi)有body
將value的值存儲(chǔ)至范圍為scope的varName變量之中
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
語(yǔ)法2: 有body
將body內(nèi)容存儲(chǔ)至范圍為scope的varName變量之中
<c:set value="value" [scope="{page|request|session|application}"]>
body.....
</c:set>
語(yǔ)法3: 將value的值存儲(chǔ)至target對(duì)象屬性中
<c:set value="value" target="target" property="propertyNmae"/>
語(yǔ)法4: 將body內(nèi)容的數(shù)據(jù)存儲(chǔ)至target對(duì)象屬性中
<c:set target="target" property="propertyNmae">
body....
</c:set>
Attribute
----------------------------------------------------------------------------------------
名稱(chēng) 說(shuō)明 EL 類(lèi)型 必須 默認(rèn)值
value 要被存儲(chǔ)的值 Y Object 否 無(wú)
var 欲存入的變量名 N String 否 無(wú)
scope var變量的JSP范圍 N String 否 page
target 為一JavaBean或java.util.Map對(duì)象 Y Object 否 無(wú)
property 指定target對(duì)象屬性 Y String 否 無(wú)
------------------------------------------------------------------------------------------
Null 和 錯(cuò)誤處理:
語(yǔ)法3和語(yǔ)法4會(huì)產(chǎn)生異常錯(cuò)誤,有以下兩種情況:
.target 為null
.target 不是java.util.Map或JavaBean對(duì)象
假若value為null時(shí):將由存儲(chǔ)變量改為移除變量
.語(yǔ)法1: 由var和scope所定義的變量,將被移除
.若scope已指定時(shí),則PageContext.removeAttribute(varName,scope);
.若scope未指定時(shí),則PageContext.removeAttribute(varName);
.語(yǔ)法3:
.假若target為Map時(shí),則Map.remove(property);
.假若target為JavaBean時(shí),propertye指定的屬性為null
注意: var和scope這兩個(gè)屬性不能使用表達(dá)式來(lái)表示,我們不能寫(xiě)成 scope="${ourScope}"或var="${a}"
<c:remove>:主要用來(lái)移除變量。
語(yǔ)法:
<c:remove var="varName" [scope="{page|request|session|application}"]/>
Attribute
----------------------------------------------------------------------------------------
名稱(chēng) 說(shuō)明 EL 類(lèi)型 必須 默認(rèn)值
var 欲移除變量的名稱(chēng) N String 是 無(wú)
scope var變量的JSP范圍 N String 否 page
----------------------------------------------------------------------------------------
說(shuō)明:
<c:remove>必須要有var屬性,即要被移除的屬性名稱(chēng),scope則可有可無(wú),如:
<c:remove var="username" scope="session"/>
將username變量從session范圍移除。若我們不設(shè)定scope,則<c:remove>會(huì)移除所有范圍名稱(chēng)為username
的數(shù)據(jù)。
<c:catch>:主要用來(lái)處理產(chǎn)生錯(cuò)誤的異常情況,并且將信息保存起來(lái)。
語(yǔ)法:
<c:catch [var="varName"]>
...欲抓取錯(cuò)誤的部分...
</c:catch>
Attribute
----------------------------------------------------------------------------------------
名稱(chēng) 說(shuō)明 EL 類(lèi)型 必須 默認(rèn)值
var 用來(lái)存儲(chǔ)錯(cuò)誤信息的變量 N String 否 無(wú)
-----------------------------------------------------------------------------------------
說(shuō)明:
<c:catch>主要將可能發(fā)生錯(cuò)誤的部分放在<c:catch>和</c:catch>之間。如果真的發(fā)生錯(cuò)誤,可將錯(cuò)誤
信息保存至變量varName標(biāo)量中,如:
<c:catch var="message">
//可能發(fā)生錯(cuò)誤的部分
</catch>
另外,當(dāng)錯(cuò)誤發(fā)生<c:catch>和</c:catch>之間時(shí),只有<c:catch>和</c:catch>之間的程序會(huì)被中止忽
略,但整個(gè)網(wǎng)頁(yè)不會(huì)被中止。
流程控制
流程控制分類(lèi)中包含四個(gè)標(biāo)簽:<c:if>,<c:choose>,<c:when>和<c:otherwise>。
<c:if>:的用途和我們?cè)谝话愠绦蛑袑?xiě)的if一樣。
語(yǔ)法:
語(yǔ)法1:沒(méi)有body
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
語(yǔ)法2: 有body
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|appliation}"]>
...body....
</c:if>
Attribute
------------------------------------------------------------------------------------------------------------------------
名稱(chēng) 說(shuō)明 EL 類(lèi)型 必須 默認(rèn)值
test 如果表達(dá)式的結(jié)果為true則執(zhí)行body,false則相反 Y boolean 是 無(wú)
var 用來(lái)存儲(chǔ)test運(yùn)算后的結(jié)果,即true或false N String 否 無(wú)
scope var變量的JSP范圍 N String 否 page
------------------------------------------------------------------------------------------------------------------------
說(shuō)明:
<c:if>標(biāo)簽必須要有test屬性,body里除了能是靜態(tài)文本之外可以是任何JSP代碼,標(biāo)簽或HTML代碼。
<c:choose>:本身只當(dāng)作<c:when>和<c:otherwise>的父標(biāo)簽。
語(yǔ)法:
<c:choose>
body(<when>和<otherwise>)
</c:choose>
限制:
<c:choose>的本地內(nèi)容只能有:
.空白
.1或多個(gè)<c:when>
.0或多個(gè)<c:otherwise>
如:
<c:choose>
<c:when test="${condition1}">
condition1 為 true
</c:when>
<c:when test="${condition2}">
condition2 為 true
</c:when>
<c:otherwise>
condition1和conditon2都為false
</<c:otherwise >
</c:choose>
說(shuō)明:
在同一個(gè)<c:choose>中,假如所有的<c:when>的test都不為true時(shí),則執(zhí)行<c:otherwise>的本體內(nèi)容。
在同一個(gè)<c:choose>中,假若有好幾個(gè)<c:when>都會(huì)true時(shí),只能有一個(gè)<c:when>成立。
迭代操作
迭代(Iterator)操作主要包含兩個(gè)標(biāo)簽: <c:forEach>和<c:forTokens>。
<c:forEach>為循環(huán)控制,它可以將集合(Collection)中的成員循序?yàn)g覽一遍。運(yùn)做方式為當(dāng)條件符合
時(shí),就會(huì)持續(xù)重復(fù)執(zhí)行<c:forEach>的body內(nèi)容。
語(yǔ)法:
語(yǔ)法1: 迭代一集合對(duì)象之所有成員
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
...body內(nèi)容.....
<c:forEach>
語(yǔ)法2: 迭代指定的次數(shù)
<c:forEach [var="varName"] [varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
...body內(nèi)容.....
<c:forEach>
Attribute
--------------------------------------------------------------------------------------------------------------------------
名稱(chēng) 說(shuō)明 EL 類(lèi)型 必須 默認(rèn)值
var 用來(lái)存放現(xiàn)在指到的成員 N String 否 無(wú)
Arrays
Collection
Iterator 否 無(wú)
items 被迭代的集合對(duì)象 Y Enumeration
Map
String
varStatus 用來(lái)存放到指到的相關(guān)成員信息 N String 否 無(wú)
begin 開(kāi)始的位置 Y int 否 0
end 結(jié)束的位置 Y int 否 最后一個(gè)成員
setp 每次迭代的間隔數(shù) Y int 否 1
-------------------------------------------------------------------------------------------------------------------------
Null 和 錯(cuò)誤處理
.假若items為null時(shí),則表示為一空的集合對(duì)象
.假若begin大于或等于items時(shí),則迭代不運(yùn)算
注意:
varName的范圍只存在<c:forEach>的本體中,如果超出了本題,則不能取得varName的值。如:
<c:forEach items="${atts}" var="item">
</c:forEach>
${item}</br>
${item}則不會(huì)顯示item的內(nèi)容。<c:forEach>除了支持?jǐn)?shù)組之外,還有標(biāo)準(zhǔn)的J2SE的結(jié)合類(lèi)型,例如:
ArrayList,List,LinkedList,Vector,Stack和Set等等;另外包括java.util.Map類(lèi)的對(duì)象,例如:
HashMap,Hashtable,Properties,Provider和Attributes。
另外<c:forEach>還提供了varStatus屬性,主要用來(lái)存放現(xiàn)在指到成員的相關(guān)信息。例如:我們寫(xiě)成
varStatus="s",那么就會(huì)把信息存放到名稱(chēng)為s的屬性當(dāng)中。varStatus屬性還提供另外四個(gè)屬性:index,
count,fist和last,它們個(gè)自的意義如下:
------------------------------------------------------------------------------------------
屬性 類(lèi)型 意義
index number 現(xiàn)在指到成員的索引
count number 總共指到成員的總和
first boolean 現(xiàn)在指到成員是否為第一個(gè)
last boolean 現(xiàn)在指到成員是否為最后一個(gè)
-------------------------------------------------------------------------------------------
如下例子:
<%@page contentType="text/html;charset=gb2312"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String atts[] = new String[5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="girl";
request.setAttritue("atts",atts);
%>
<c:forEach items="${atts}" var="item" varStatus="s">
<h2><c:out value="${item}"/>的四種屬性></h2>
index: ${s.index}</br>
count: ${s.count}</br>
first: ${s.first}</br>
last: ${s.last}</br>
</c:forEach>
<c:forTokens>
<c:forTokens>:用來(lái)瀏覽一字符串中所有的成員,起成員是由定義符號(hào)(delimiters)所分隔的。
語(yǔ)法:
<c:forTokens items="stringFoTokens" delims="delimmmmiters" [var="varName"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
...body內(nèi)容....
</c:forTokens>
Attribute
--------------------------------------------------------------------------------------------------------------------
名稱(chēng) 說(shuō)明 EL 類(lèi)型 必須 默認(rèn)值
var 用來(lái)存放現(xiàn)在指到的成員 Y String 否 無(wú)
items 被迭代的字符串 Y String 是 無(wú)
delims 定義用來(lái)分割字符串的字符 N String 是 無(wú)
varStatus 用來(lái)存放現(xiàn)在指到的相關(guān)成員信息 N String 否 無(wú)
begin 開(kāi)始的位置 Y int 否 0
end 結(jié)束的位置 Y int 否 最后一個(gè)成員
step 每次迭代間隔數(shù) Y int 否 1
---------------------------------------------------------------------------------------------------------------------
限制:
.假若有begin屬性時(shí),begin必須大于等于0
.假若有end屬性時(shí),必須大于begin
.假若有step屬性時(shí),step必須大于等于1
Null 和 錯(cuò)誤處理
.假如itmes為null時(shí),則表示為有空的集合對(duì)象
.假若begin大于等于items的大小時(shí),則迭代不運(yùn)算
例子:
<c:forToken items="A,B,C,D,E,F,G" delims="," var="item>
${item}
</c:forToken>
items屬性也可以用EL,例如:
<%
String phonenumber="123-456-7899";
request.setAttribute("userPhone",phonenumber);
%>
<c:forTokens items="${userPhone}" delims="-" var="item">
${item}
</c:forTokens>
URL操作
JSTL包含三個(gè)URL操作有關(guān)的標(biāo)簽,分別是: <c:import>,<c:redirect>和<c:url>。它們的主要功能是:
用來(lái)將其他文件的內(nèi)容包含起來(lái),網(wǎng)頁(yè)的向?qū)В€有url的產(chǎn)生。
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
JavaEye推薦