JSTL-核心標簽庫
JSTL 全名為Java Server Pages Standard Tag Library(JSP Standard Tag Library),它的中文名稱為JSP標準標簽函數庫。 Web 程序開發人員能夠利用JSTL和EL來開發Web程序,取代傳統直接在頁麵上嵌入Java程序(Scripting)的做法,以提高程序可讀性、維護性和方便性。
JSTL是一個標準的已製定好的標簽庫,可以應用於各種領域,如:基本輸入輸出、流程控製、循環、XML文件剖析、數據庫查詢及國際化和文字格式標準化的應用等。
JSTL所提供的標簽函數庫主要分為五大類:
(1)核心標簽庫(Core tag library)
(2)I18N格式標簽庫 (I18N-capable formatting tag library)
(3)SQL標簽庫 (SQL tag library)
(4)XML標簽庫 (XML tag library)
(5)函數標簽庫(Functions tag library)
JSTL |
前綴 |
URI |
核心標簽庫 |
c |
https://java.sun.com/jsp/jstl/core |
I18N格式標簽庫 |
fmt |
https://java.sun.com/jsp/jstl/xml |
SQL標簽庫 |
sql |
https://java.sun.com/jsp/jstl/sql |
XML標簽庫 |
xml |
https://java.sun.com/jsp/jstl/fmt |
函數標簽庫 |
fn |
https://java.sun.com/jsp/jstl/functions |
若要在JSP網頁中使用JSTL,一定要先做下麵這行聲明:
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
核心標簽庫(Core tag library)
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>
<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的值 |
Y |
Object |
否 |
無 |
escapeXml |
是否轉換特殊字符,如:<轉換成< |
Y |
boolean |
否 |
true |
注意
表格中的EL字段,表示此屬性的值是否可以為EL表達式,例如:Y表示attribute = "${表達式}"為符合語法的,N則反之。
Null 和錯誤處理
假若 value為null,會顯示default的值;假若沒有設定default的值,則會顯示一個空的字符串。
說明
一般來說,<c:out>默認會將<、>、’、” 和& 轉換為 <、>、'、"和 &。
假若不想轉換時,隻需要設定<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>
<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">
… 本體內容
</c:set>
屬性
名稱 |
說明 |
EL |
類型 |
必須 |
默認值 |
value |
要被儲存的值 |
Y |
Object |
否 |
無 |
var |
欲存入的變量名稱 |
N |
String |
否 |
無 |
scopevar |
變量的JSP範圍 |
N |
String |
否 |
page |
target |
為一JavaBean或java.util.Map對象 |
Y |
Object |
否 |
無 |
property |
指定target對象的屬性 |
Y |
String |
否 |
無 |
範例
<c:set var="number" scope="request" value="${1 + 1}" />
<c:set var="number" scope="session" />
${3 + 5}
</c:set>
<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>主要用來移除變量。
語法
<c:remove var="varName" [scope="{ page|request|session|application }"] />
屬性
名稱 |
說明 |
EL |
類型 |
必須 |
默認值 |
var |
欲移除的變量名稱 |
N |
String |
是 |
無 |
scope |
var變量的JSP範圍 |
N |
String |
否 |
page |
說明
<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>主要用來處理產生錯誤的異常狀況,並且將錯誤信息儲存起來。
語法
<c:catch [var="varName"] >
… 欲抓取錯誤的部分
</c:catch>
屬性
名稱 |
說明 |
EL |
類型 |
必須 |
默認值 |
var |
用來儲存錯誤信息的變量 |
N |
String |
否 |
無 |
說明
<c:catch>主要將可能發生錯誤的部分放在<c:catch>和</c:catch>之間。如果真的發生錯
誤,可以將錯誤信息儲存至varName變量中,例如:
<c:catch var="message">
: //可能發生錯誤的部分
</c:catch>
另外,當錯誤發生在<c:catch>和</c:catch>之間時,則隻有<c:catch>和</c:catch>之間的程序會被中止忽略,但整個網頁不會被中止。
<c:if>
<c:if>的用途就和我們一般在程序中用的if一樣。
語法
語法1:沒有本體內容(body)
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]/>
語法2:有本體內容
<c:if test="testCondition" [var="varName"][scope="{page|request|session|application}"]>
具體內容
</c:if>
屬性
名稱 |
說明 |
EL |
類型 |
必須 |
默認值 |
Test |
如果表達式的結果為true,則執行本體內容,false則相反 |
Y |
boolean |
是 |
無 |
var |
用來儲存test運算後的結果,即true或false |
N |
String |
否 |
無 |
scope |
var變量的JSP範圍 |
N |
String |
否 |
page |
<c:choose>
<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>
<c:when>的用途就和我們一般在程序中用的when一樣。
語法
<c:when test="testCondition" >
本體內容
</c:when>
屬性
名稱 |
說明 |
EL |
類型 |
必須 |
默認值 |
Test |
如果表達式的結果為true,則執行本體內容,false則相反 |
Y |
boolean |
是 |
無 |
限製
<c:when>必須在<c:choose>和</c:choose>之間
在同一個<c:choose>中時,<c:when>必須在<c:otherwise>之前
說明
<c:when>必須有test屬性,當test中的表達式結果為true時,則會執行本體內容;如果為
false時,則不會執行。
<c:otherwise>
在同一個 <c:choose>中,當所有 <c:when>的條件都沒有成立時,則執行<c:otherwise>的
本體內容。
語法
<c:otherwise>
本體內容
</c:otherwise>
<c:forEach>
<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
Null 和錯誤處理
·假若items為null 時,則表示為一空的集合對象
·假若begin大於或等於items時,則迭代不運算
<html>
<head>
<title>CH7 - Core_forEach.jsp</title>
</head>
<body>
<h2><c:out value="<c:forEach> 的用法" /></h2>
<%
String atts[] = new String [5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="pen";
request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item" >
${item}</br>
</c:forEach>
</body>
</html>
<c:forEach>除了支持數組之外,還有標準J2SE 的集合類型,例如:ArrayList、List、LinkedList、Vector、Stack和Set 等等;另外還包括java.util.Map 類的對象.
<c:forEach>並不隻是用來瀏覽集合對象而已,讀者可以從語法2中發現,items並不存在,但是當沒有使用items屬性時,就一定要使用begin和end這兩個屬性。
<html>
<head>
<title>CH7 - Core_forEach2.jsp</title>
</head>
<body>
<h2><c:out value=" 循環" /></h2>
<c:forEach begin="1" end="10" var="item" >
${item}</br>
</c:forEach>
</body>
</html>
上述範例中,我們並沒有執行瀏覽集合對象,隻是設定begin 和end 屬性的值,這樣它就
變成一個普通的循環。此範例是將循環設定為:從1 開始跑到10,總共會重複循環10 次,並
且將數字放到item 的屬性當中.
begin主要用來設定在集合對象中開始的位置(注意:第一個位置為0);end 用來設定結束的位置;而step 則是用來設定現在指到的成員和下一個將被指到成員之間的間隔.
另外,<c:forEach>還提供varStatus屬性,主要用來存放現在指到之成員的相關信息。例如: varStatus="s",那麼將會把信息存放在名稱為s的屬性當中。varStatus屬性還有另外四個屬性:index、count、first和last,它們各自代表的意義如表:
屬性 |
類型 |
意義 |
index |
number |
現在指到成員的索引 |
count |
number |
總共已經指到成員的總數 |
first |
boolean |
現在指到的成員是否為第一個成員 |
last |
boolean |
現在指到的成員是否為最後一個成員 |
可以使用varStatus 屬性取得循環正在瀏覽之成員的信息,下麵為一個簡單的範例:
<html>
<head>
</head>
<body>
<h2><c:out value="<c:forEach> varStatus 的四種屬性" /></h2>
<%
String atts[] = new String [5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="pen";
request.setAttribute("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>
</body>
</html>
還有一個例子,要獲取:https://localhost:8080/t/index.jsp?a=123&b=256&com=297中的參數列表按如下:
鍵com:297
鍵b:256
鍵a:123
可以結合EL表單式實現:
鍵${b.key}:${b.value }<br/>
</c:forEach>
<c:forTokens>
<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>的範例:
<c:forTokens items="A,B,C,D,E" delims="," var="item" >
${item}
</c:forTokens>
上麵範例執行後,將會在網頁中輸出ABCDE。它會把符號“,”當做分割的標記,拆成5 個部分,也就是執行循環5 次,但是並沒有將A,B,C,D,E 中的“,”顯示出來。items 也可以放入EL 的表達式,如下:
<%
String phoneNumber = "123-456-7899";
request.setAttribute("userPhone", phoneNumber);
%>
<c:forTokens items="${userPhone}" delims="-" var="item" >
${item}
</c:forTokens>
這個範例將會在網頁上打印1234567899,也就是把123-456-7899以“-”當做分割標記,將字符串拆為3 份,每執行一次循環就將瀏覽的部分放到名稱為item 的屬性當中。delims 不隻指定一種字符來分割字符串,它還可以一次設定多個分割字符串用的字符。如下麵這個範例:
${item}
</c:forTokens>
此範例會在網頁輸出ABCDE,也就是說,delims 可以一次設定所有想當做分割字符串用的字符。其實用<c:forEach>也能做到分割字符串,寫法如下:
${item}
</c:forEach>
上述範例同樣也會在網頁輸出ABCDE。<c:forEach>並沒有delims這個屬性,因此<c:forEach>無法設定分割字符串用的字符,而<c:forEach>分割字符串用的字符隻有“,”,這和使用<c:forTokens>,delims 屬性設為“,”的結果相同。所以如果使用<c:forTokens>來分割字符串,功能和彈性上會比使用<c:forEach>來得較大。
原帖地址:https://www.cnblogs.com/Fskjb/archive/2009/07/05/1517164.html
最後更新:2017-04-02 22:16:12