1. 程式人生 > >jstl標籤: c:Foreach用法詳解

jstl標籤: c:Foreach用法詳解

為迴圈控制,它可以將集合(Collection)中的成員循序瀏覽一遍。運作方式為當條件符合時,就會持續重複執行的本體內容。
語法
語法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>
標籤具有以下一些屬性:

var:迭代引數的名稱。在迭代體中可以使用的變數的名稱,用來表示每一個迭代變數。型別為String。
items:要進行迭代的集合。對於它所支援的型別將在下面進行講解。
varStatus:迭代變數的名稱,用來表示迭代的狀態,可以訪問到迭代自身的資訊。
begin:如果指定了items,那麼迭代就從items[begin]開始進行迭代;如果沒有指定items,那麼就從begin開始迭代。它的型別為整數。
end:如果指定了items,那麼就在items[end]結束迭代;如果沒有指定items,那麼就在end結束迭代。它的型別也為整數。
step:迭代的步長。
標籤的items屬性支援Java平臺所提供的所有標準集合型別。此外,您可以使用該操作來迭代陣列(包括基本型別陣列)中的元素。它所支援的集合型別以及迭代的元素如下所示:
java.util.Collection:呼叫iterator()來獲得的元素。
java.util.Map:通過java.util.Map.Entry所獲得的例項。
java.util.Iterator:迭代器元素。
java.util.Enumeration:列舉元素。
Object例項陣列:陣列元素。
基本型別值陣列:經過包裝的陣列元素。
用逗號定界的String:分割後的子字串。
javax.servlet.jsp.jstl.sql.Result:SQL查詢所獲得的行。
不論是對整數還是對集合進行迭代,的varStatus 屬性所起的作用相同。和var屬性一樣,varStatus用於建立限定了作用域的變數(改變數只在當前標籤體內起作用)。不過,由varStatus屬性命名的變數並不儲存當前索引值或當前元素,而是賦予javax.servlet.jsp.jstl.core.LoopTagStatus類的例項。該類包含了一系列的特性,它們描述了迭代的當前狀態,如下這些屬性的含義如下所示:
current:當前這次迭代的(集合中的)項。
index:當前這次迭代從0開始的迭代索引。
count:當前這次迭代從1開始的迭代計數。
first:用來表明當前這輪迭代是否為第一次迭代,該屬性為boolean型別。
last:用來表明當前這輪迭代是否為最後一次迭代,該屬性為boolean型別。
begin:begin屬性的值。
end:end屬性的值
step:step屬性的值
下面就來看一個個基本的例子,表格隔行背景色變化

<c:forEach var="item" items="${contents}" varStatus="status">  
<tr><c:if test="${status.count%2==0}">bgcolor="#CCCCFE"</c:if> align="left">  
xxx   
</tr>  
</c:forEach>
限制
·假若有begin屬性時,begin必須大於等於 0
·假若有end屬性時,必須大於begin
·假若有step屬性時,step必須大於等於0
Null 和 錯誤處理
·假若items為null時,則表示為一空的集合物件
·假若begin大於或等於items時,則迭代不運算
說明
如果要循序瀏覽一個集合物件,並將它的內容顯示出來,就必須有items屬性。
範例
下面的範例 Core_forEach.jsp是將陣列中的成員一個個顯示出來的:
Core_forEach.jsp
<%@ page contentType="text/html;charset=GB2312 " %>
<%@ taglib prefix="c" uri="
http://java.sun.com/jsp/jstl/core
" %>
<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="$" var="item" >
$</br>
</c:forEach>
</body>
</html>
在上述範例中,筆者先產生一個字串陣列,然後將此陣列atts儲存至Request的屬性範圍中,再用將它循序瀏覽一遍。這裡items表示被瀏覽的集合物件,var用來存放指定的集合物件中成員,最後使用將item的內容顯示出來,執行結果如圖-8所示。
注意
varName的範圍只存在的本體中,如果超出了本體,則不能再取得varName的值。上個例子中,若$ 是在之後執行時,如:
<c:forEach items="$" var="item" ></c:forEach>$</br><c:forEach items="$" var="item" >
</c:forEach>
$</br>
$則不會顯示item的內容。
除了支援陣列之外,還有標準J2SE的集合型別,例如:ArrayList、List、LinkedList、Vector、Stack和Set 等等;另外還包括java.util.Map類的物件,例如:HashMap、Hashtable、Properties、Provider和Attributes。
還有begin、end和step這三種屬性:begin主要用來設定在集合物件中開始的位置(注意:第一個位置為0);end用來設定結束的位置;而step則是用來設定現在指到的成員和下一個將被指到成員之間的間隔。我們將之前的範例改成如下:
Core_forEach1.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>CH7 - Core_forEach1.jsp</title>
</head>
<body>
<h2><c:out value="<c:forEach> begin、end和step的用法" /></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="$" var="item" begin="1" end="4" step="2" >
$</br>
</c:forEach>
</body>
</html>
中指定的集合物件atts將會從第2個成員開始到第5個成員,並且每執行一次迴圈都會間隔一個成員瀏覽。因此結果是隻顯示atts[1]和atts[3]的內容