15.5 迭代標籤
迭代標籤包括以下幾種。
<c:forEach>:用於遍歷集合中的對象,並且能重複執行標籤主體。
<c:forTokens>:用於遍歷字符串中用特定分隔符分隔的子字符串,並且能重複執行標籤主體。
15.5.1 <c:forEach>標籤(1)
<c:forEach>標籤用於遍歷集合中的對象,並且能重複執行標籤主體,它和本書第13章的13.4節(創建和使用iterate標籤)介紹的<iterate>標籤的作用有些相似。
1.基本語法
<c:forEach>標籤的基本語法爲:
- <c:forEach var="代表集合中的一個元素的命名變量的名字" items="集合">
- 標籤主體
- </c:forEach>
<c:forEach>標籤每次從集合中取出一個元素,並且把它存放在NESTED範圍內的命名變量中,在標籤主體中可以訪問這個命名變量。NESTED範圍是指當前標籤主體構成的範圍,只有當前標籤主體才能夠訪問NESTED範圍內的命名變量。
例如以下代碼先創建了一個names集合,然後通過<c:forEach>標籤遍歷這個集合,並打印集合中的所有元素:
- <%@ page import="java.util.HashSet" %>
- <%
- HashSet names=new HashSet();
- names.add("Tom");
- names.add("Mike");
- names.add("Linda");
- %>
- <c:forEach var="name" items="<%=names %>" >
- ${name}
- </c:forEach>
運行以上代碼,得到的打印結果爲"Tom Mike Linda"。以上<c:forEach>標籤等價於以下Java程序片段:
- <%@ page import="java.util.Iterator" %>
- <% //第一個Java程序片段
- Iterator it=names.iterator();
- while(it.hasNext()){
- String name=(String)it.next();
- //把元素作爲name命名變量存放在頁面範圍內
- pageContext.setAttribute("name",name);
- %>
- <% //第二個Java程序片段,對應<c:forEach>標籤的主體
- name=(String)pageContext.getAttribute("name");
- out.print(name+" ");
- %>
- <% //第三個Java程序片段
- pageContext.removeAttribute("name");
- }
- %>
以上第一個和第三個Java程序片段完成<c:forEach>標籤的任務,即在每一次循環中,先從names集合中取出一個元素,把它作爲name命名變量存放在頁面範圍內,接着執行標籤主體,然後從頁面範圍內刪除name命名變量,從而確保只有當前標籤主體才能訪問name命名變量。因此儘管在實現上,name命名變量位於頁面範圍,但是在邏輯上,name命名變量屬於NESTED範圍。
以上第二個Java程序片段完成<c:forEach>標籤主體的任務,即從頁面範圍內讀取name命名變量,並輸出它的值。
2.<c:forEach>標籤的varStatus屬性
<c:forEach>標籤的varStatus屬性用於設定一個javax.servlet.jsp.jstl.core. LoopTagStatus類型的命名變量,它位於NESTED範圍,這個命名變量包含了從集合中取出的當前元素的狀態信息。
count:當前元素在集合中的序號,從1開始計數。
index:當前元素在集合中的索引,從0開始計數。
first:當前元素是否是集合中的第一個元素。
last:當前元素是否是集合中的最後一個元素。
例程15-2的namelist.jsp中的<c:forEach>標籤就使用了varStatus屬性。
例程15-2 namelist.jsp
- <%@ page contentType="text/html; charset=GB2312" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <%@ page import="java.util.HashSet" %>
- <%
- HashSet names=new HashSet();
- names.add("Tom");
- names.add("Mike");
- names.add("Linda");
- %>
- <table border="1">
- <tr>
- <td>序號</td>
- <td>索引</td>
- <td>是否是第一個元素</td>
- <td>是否是最後一個元素</td>
- <td>元素的值</td>
- </tr>
- <c:forEach var="name" items="<%=names %>" varStatus="status">
- <tr>
- <td>${status.count} </td>
- <td>${status.index} </td>
- <td>${status.first} </td>
- <td>${status.last} </td>
- <td>
- <c:choose>
- <c:when test="${status.last}">
- <font color="red">${name} </font>
- </c:when>
- <c:otherwise>
- <font color="green">${name} </font>
- </c:otherwise>
- </c:choose>
- </td>
- </tr>
- </c:forEach>
- </table>