标砖标签库 迭代标签入门

 

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章