jstl 全名為java server pages standard tag library(jsp standard tag library),它的中文名稱為jsp 标準标簽函數庫。 web 程式開發人員能夠利用jstl和el來開發web 程式,取代傳統直接在頁面上嵌入java程式(scripting)的做法,以提高程式可讀性、維護性和友善性。 jstl是一個标準的已制定好的标簽庫,可以應用于各種領域,如:基本輸入輸出、流程控制、循環、xml檔案剖析、資料庫查詢及國際化和文字格式标準化的應用等。jstl所提供的标簽函數庫主要分為五大類:
jstl
字首
uri
核心标簽庫
c
http://java.sun.com/jsp/jstl/core
i18n格式标簽庫
fmt
http://java.sun.com/jsp/jstl/xml
sql标簽庫
sql
http://java.sun.com/jsp/jstl/sql
xml标簽庫
xml
http://java.sun.com/jsp/jstl/fmt
函數标簽庫
fn
http://java.sun.com/jsp/jstl/functions
若要在jsp 網頁中使用jstl ,一定要先做下面這行聲明:
< %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
core 标簽庫,又被稱為核心标簽庫,該标簽庫的工作是對于 jsp 頁面一般處理的封裝。在該标簽庫中的标簽一共有 14 個,被分為了四類,分别是:
q 通用核心标簽: <c:out> 、 <c:set> 、 <c:remove> 、 <c:catch> 。
q 條件控制标簽: <c:if> 、 <c:choose> 、 <c:when> 、 <c:otherwise> 。
q 循環控制标簽: <c:foreach> 、 <c:fortokens> 。
q url 相關标簽: <c:import> 、 <c:url> 、 <c:redirect> 、 <c:param> 。
<c:out>主要用來顯示資料的内容,就像是 <%= scripting-language %> 一樣,例如:hello ! <c:out value="${username}" />
文法
文法1:沒有本體(body)内容
<c:out value="value" [escapexml="{true|false}"] [default="defaultvalue"] />
文法2:有本體内容
<c:out value="value" [escapexml="{true|false}"]>
default value
</c:out>
屬性名稱
說明
el
類型
必須
預設值
value
需要顯示出來的值
y
object
是
無
default
如果value的值為null則顯示default的值
否
escapexml
是否轉換特殊字元,如:<轉換成&lt;
boolean
true
注意
表格中的el字段,表示此屬性的值是否可以為el 表達式,例如:y表示 attribute = "${表達式}"為符合文法的,n 則反之。
null 和錯誤處理
· 假若 value為null,會顯示default 的值;假若沒有設定default的值,則會顯示一個空
的字元串。
一般來說,<c:out>預設會将 <、>、’、” 和 & 轉換為 &lt;、&gt;、&#039;、&#034; 和 &amp;。
假若不想轉換時,隻需要設定<c:out>的escapexml 屬性為fasle 就可以了。
範例
<c:out value="hello jsp 2.0 !! " />
<c:out value="${ 3 + 5 }" />
<c:out value="${ param.data }" default="no data" />
<c:out value="<p>有特殊字元</p>" />
<c:out value="<p>有特殊字元</p>" escapexml="false" />
1.在網頁上顯示 hello jsp 2.0 !! ;
2.在網頁上顯示 8;
3.在網頁上顯示由窗體傳送過來的data 參數之值,假若沒有data 參數,或data 參數的值為null 時,則網頁上會顯示no data;
4.在網頁上顯示“<p>有特殊字元</p>”;
5.在網頁上顯示“有特殊字元”。
<c:set>主要用來将變量儲存至jsp範圍中或是javabean的屬性中。
文法1:将 value 的值儲存至範圍為scope 的 varname 變量之中
<c:set value="value" var="varname" [scope="{ page|request|session|application }"]/>
文法2:将本體内容的資料儲存至範圍為scope 的 varname 變量之中
<c:set var="varname" [scope="{ page|request|session|application }"]>
… 本體内容
</c:set>
文法3:将 value 的值儲存至 target 對象的屬性中
< c:set value="value" target="target" property="propertyname" />
文法4:
将本體内容的資料儲存至 target 對象的屬性中
<c:set target="target" property="propertyname">
屬性
名稱
要被儲存的值
var
欲存入的變量名稱
n
string
scopevar
變量的jsp範圍
page
target
為一javabean或java.util.map對象
property
指定target對象的屬性
<c:set var="number" scope="request" value="${1 + 1}" />
<c:set var="number" scope="session" />
${3 + 5}
<c:set var="number" scope="request" value="${ param.number }" />
<c:set target="user" property="name" value="${ param.username}" />
1.将2 存入request 範圍的number 變量中;
2.将8 存入session 範圍的number 變量中;<c:set>是把本體(body)運算後的結果來當做value的值。
3.假若 ${param.number}為null 時,則移除request 範圍的number 變量;若${param.number}不為null 時,則将 ${param.number}的值存入request 範圍的number 變量中;
4.假若 ${param.username}為null 時,則設定user(javabean)的name 屬性為null;若不為
null 時,則将 ${param.username}的值存入user(javabean)的name 屬性(setter 機制)。
上述範例的3.中,假若 ${param.number}為null時,則表示移除request範圍的number變量。
<c:remove>主要用來移除變量。
<c:remove var="varname" [scope="{ page|request|session|application }"] />
欲移除的變量名稱
scope
var變量的jsp範圍
<c:remove>必須要有var 屬性,即要被移除的屬性名稱,scope 則可有可無,例如:
<c:remove var="number" scope="session" />
将number 變量從session 範圍中移除。若我們不設定scope,則<c:remove>将會從page、
request、session 及application 中順序尋找是否存在名稱為number 的資料,若能找到時,則将它移除掉,反之則不會做任何的事情。
注意:當不指定scope時,回remove掉從page到application的var指定的變量
<c:catch>主要用來處理産生錯誤的異常狀況,并且将錯誤資訊儲存起來。
<c:catch [var="varname"] >
… 欲抓取錯誤的部分
</c:catch>
用來儲存錯誤資訊的變量
<c:catch>主要将可能發生錯誤的部分放在<c:catch>和</c:catch>之間。如果真的發生錯
誤,可以将錯誤資訊儲存至varname 變量中,例如:
<c:catch var="message">
: //可能發生錯誤的部分
另外,當錯誤發生在<c:catch>和</c:catch>之間時,則隻有<c:catch>和</c:catch>之間的程式
會被中止忽略,但整個網頁不會被中止。
<c:if>的用途就和我們一般在程式中用的if 一樣。
文法1:沒有本體内容(body)
<c:if test="testcondition" [var="varname"] [scope="{page|request|session|application}"]/>
<c:if test="testcondition" [var="varname"] [scope="{page|request|session|application}"]>
具體内容
</c:if>
test
如果表達式的結果為true,則執行本體内容,false則相反
用來儲存test運算後的結果,即true或false
<c:choose>本身隻當做 <c:when> 和 <c:otherwise> 的父标簽。
<c:choose>
本體内容( <when> 和 <otherwise> )
</c:choose>
限制
<c:choose>的本體内容隻能有:
·空白
·1 或多個 <c:when>
·0 或多個 <c:otherwise>
若使用<c:when>和<c:otherwise>來做流程控制時,兩者都必須為<c:choose>的子标簽.
<c:when>的用途就和我們一般在程式中用的when 一樣。
<c:when test="testcondition" >
本體内容
</c:when>
如果表達式的結果為true,則執行本體内容,false則相反
<c:when>必須在<c:choose>和</c:choose>之間
在同一個<c:choose>中時,<c:when>必須在<c:otherwise>之前
<c:when>必須有test 屬性,當test中的表達式結果為true時,則會執行本體内容;如果為
false時,則不會執行。
在同一個 <c:choose> 中,當所有 <c:when> 的條件都沒有成立時,則執行<c:otherwise> 的
本體内容。
<c:otherwise>
</c:otherwise>
<c:foreach> 為循環控制,它可以将集合(collection)中的成員循序浏覽一遍。運作方式為當
條件符合時,就會持續重複執行<c:foreach>的本體内容。
文法1:疊代一集合對象之所有成員
<c:foreach [var="varname"] items="collection" [varstatus="varstatusname"] [begin="begin"][end="end"] [step="step"]>
< /c:foreach>
文法2:疊代指定的次數
<c:foreach [var="varname"] [varstatus="varstatusname"] begin="begin" end="end"
[step="step"]>
</c:foreach>
·假若有begin 屬性時,begin 必須大于等于 0
·假若有end 屬性時,必須大于begin
·假若有step 屬性時,step 必須大于等于0
·假若items 為null 時,則表示為一空的集合對象
·假若begin 大于或等于items 時,則疊代不運算
<c:foreach>除了支援數組之外,還有标準j2se 的集合類型,例如:arraylist、list、
linkedlist、vector、stack和set 等等;另外還包括java.util.map 類的對象.
<c:foreach>并不隻是用來浏覽集合對象而已,讀者可以從文法2中發現,items并不存在
,但是當沒有使用items 屬性時,就一定要使用begin 和end 這兩個屬性。
上述範例中,我們并沒有執行浏覽集合對象,隻是設定begin 和end 屬性的值,這樣它就
變成一個普通的循環。此範例是将循環設定為:從1 開始跑到10,總共會重複循環10 次,并
且将數字放到item 的屬性當中.
begin主要用來設定在集合對象中開始的位置(注意:第一個位置為0);end 用來設定結束的位置;而step 則是用來設定現在指到的成員和下一個将被指到成員之間的間隔.
另外,<c:foreach>還提供varstatus 屬性,主要用來存放現在指到之成員的相關資訊。例如: varstatus="s",那麼将會把資訊存放在名稱為s的屬性當中。varstatus屬性還有另外四個屬性:index、count、first 和last,它們各自代表的意義如表:
意義
index
number
現在指到成員的索引
count
總共已經指到成員的總數
first
現在指到的成員是否為第一個成員
last
現在指到的成員是否為最後一個成員
我們可以使用varstatus 屬性取得循環正在浏覽之成員的資訊,下面為一個簡單的範例:
還有一個例子:
我要擷取:http://localhost:8080/t/index.jsp?a=123&b=256&com=297中的參數清單按如下:
鍵com:297
鍵b:256
鍵a:123
可以結合el表單式實作:
<c:fortokens> 用來浏覽一字元串中所有的成員,其成員是由定義符号(delimiters)所分隔的。
文法:
<c:fortokens items="stringoftokens"
delims="delimiters"
[var="varname"]
[varstatus="varstatusname"]
[begin="begin"]
[end="end"]
[step="step"]>
</c:fortokens>
var 用來存放現在指到的成員n string 否無
items 被疊代的字元串y string 是無
delims 定義用來分割字元串的字元n string 是無
varstatus 用來存放現在指到的相關成員資訊n string 否無
begin 開始的位置y int 否0
end 結束的位置y int 否最後一個成員
step 每次疊代的間隔數y int 否1
<c:fortokens>的begin、end、step、var 和varstatus
用法都和<c:foreach>一樣,是以,筆者在這裡就隻介紹items 和delims 兩個屬性:items
的内容必須為字元串;而delims 是用來分割items 中定義的字元串之字元。
下面為一個典型的<c:fortokens>的範例:
上面範例執行後,将會在網頁中輸出abcde。它會把符号“,”當做分割的标記,拆成5 個部分,也就是執行循環5 次,但是并沒有将a,b,c,d,e 中的“,”顯示出來。items 也可以放入el 的表達式,如下:
這個範例将會在網頁上列印1234567899,也就是把123-456-7899以“-”當做分割标記,将字元串拆為3
份,每執行一次循環就将浏覽的部分放到名稱為item 的屬性當中。delims
不隻指定一種字元來分割字元串,它還可以一次設定多個分割字元串用的字元。如下面這個範例:
此範例會在網頁輸出abcde,也就是說,delims 可以一次設定所有想當做分割字元串用的字元。其實用<c:foreach>也能做到分割字元串,寫法如下:
上述範例同樣也會在網頁輸出abcde。<c:foreach>并沒有delims這個屬性,是以<c:foreach>無法設
定分割字元串用的字元,而<c:foreach>分割字元串用的字元隻有“,”,這和使
用<c:fortokens>,delims
屬性設為“,”的結果相同。是以如果使用<c:fortokens>來分割字元串,功能和彈性上會比使用<c:foreach>
來得較大。