標磚標籤庫 迭代標籤入門

 

15.5 迭代標籤

迭代標籤包括以下幾種。

<c:forEach>:用於遍歷集合中的對象,並且能重複執行標籤主體。

<c:forTokens>:用於遍歷字符串中用特定分隔符分隔的子字符串,並且能重複執行標籤主體。

15.5.1 <c:forEach>標籤(1)

<c:forEach>標籤用於遍歷集合中的對象,並且能重複執行標籤主體,它和本書第13章的13.4節(創建和使用iterate標籤)介紹的<iterate>標籤的作用有些相似。

1.基本語法

<c:forEach>標籤的基本語法爲:

  1. <c:forEach var="代表集合中的一個元素的命名變量的名字" items="集合">
  2. 標籤主體
  3. </c:forEach>

<c:forEach>標籤每次從集合中取出一個元素,並且把它存放在NESTED範圍內的命名變量中,在標籤主體中可以訪問這個命名變量。NESTED範圍是指當前標籤主體構成的範圍,只有當前標籤主體才能夠訪問NESTED範圍內的命名變量。

例如以下代碼先創建了一個names集合,然後通過<c:forEach>標籤遍歷這個集合,並打印集合中的所有元素:

  1. <%@ page import="java.util.HashSet" %>
  2. <%
  3. HashSet names=new HashSet();
  4. names.add("Tom");
  5. names.add("Mike");
  6. names.add("Linda");
  7. %>
  8. <c:forEach var="name" items="<%=names %>" >
  9. ${name} &nbsp;
  10. </c:forEach>

運行以上代碼,得到的打印結果爲"Tom Mike Linda"。以上<c:forEach>標籤等價於以下Java程序片段:

  1. <%@ page import="java.util.Iterator" %>
  2. <% //第一個Java程序片段
  3. Iterator it=names.iterator();
  4. while(it.hasNext()){
  5. String name=(String)it.next();
  6. //把元素作爲name命名變量存放在頁面範圍內
  7. pageContext.setAttribute("name",name);
  8. %>
  9. <% //第二個Java程序片段,對應<c:forEach>標籤的主體
  10. name=(String)pageContext.getAttribute("name");
  11. out.print(name+" ");
  12. %>
  13. <% //第三個Java程序片段
  14. pageContext.removeAttribute("name");
  15. }
  16. %>

以上第一個和第三個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

  1. <%@ page contentType="text/html; charset=GB2312" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <%@ page import="java.util.HashSet" %>
  4. <%
  5. HashSet names=new HashSet();
  6. names.add("Tom");
  7. names.add("Mike");
  8. names.add("Linda");
  9. %>
  10. <table border="1">
  11. <tr>
  12. <td>序號</td>
  13. <td>索引</td>
  14. <td>是否是第一個元素</td>
  15. <td>是否是最後一個元素</td>
  16. <td>元素的值</td>
  17. </tr>
  18. <c:forEach var="name" items="<%=names %>" varStatus="status">
  19. <tr>
  20. <td>${status.count} </td>
  21. <td>${status.index} </td>
  22. <td>${status.first} </td>
  23. <td>${status.last} </td>
  24. <td>
  25. <c:choose>
  26. <c:when test="${status.last}">
  27. <font color="red">${name} </font>
  28. </c:when>
  29. <c:otherwise>
  30. <font color="green">${name} </font>
  31. </c:otherwise>
  32. </c:choose>
  33. </td>
  34. </tr>
  35. </c:forEach>
  36. </table>
發佈了70 篇原創文章 · 獲贊 31 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章