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>