<c:forEach>标签
在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个<c:forEach>标签,该标签专门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容,它有两种语法格式,具体如下:
语法1:迭代包含多个对象的集合
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
语法2:迭代指定范围内的集合
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin"
end="end" [step="step"]>
body content
</c:forEach>
在上述语法格式中,可以看到<c:forEach>标签有多个属性。接下来将针对这些属性进行讲解,具体如下:
● var属性用于指将当前迭代到的元素保存到page域中的名称;
● items属性用于指定将要迭代的集合对象;
● varStatus用于指定当前迭代状态信息的对象保存到page域中的名称;
● begin属性用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始,如果没有指定items属性,就从begin指定的值开始迭代,直到迭代结束为止;
● step属性用于指定迭代的步长,即迭代因子的增量。
<c:forEach>标签在程序开发中经常会被用到,因此熟练掌握<c:forEach>标签是很有必要的,接下来,通过几个具体的案例来学习<c:forEach>标签的使用,具体如下:
1、使用标签迭代数组
为了使用<c:foreach>标签迭代数组,首先需要在数组中添加几个元素,然后将这个数组赋值给<c:foreach>标签的items属性,如例1所示。
例1 c_foreach1.jsp
1 <%@ page language="java" contentType="text/html; charset=utf-8"
2 pageEncoding="utf-8" import="java.util.*"%>
3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4 <html>
5 <head></head>
6 <body>
7 <%
8 String [] fruits={"apple","orange","grape","banana"};
9 %>
10 String数组中的元素:<br>
11 <c:forEach var="name" items="<%=fruits%>">
12 ${name}<br>
13 </c:forEach>
14 </body>
15 </html>
打开IE浏览器,在地址栏中输入http://localhost:8080/chapter08/c_foreach1.jsp
访问c_ foreach1.jsp页面,此时,浏览器窗口中显示的结果如图1所示。
图1 c_foreach1.jsp
从图1可以看出,在String数组中存入的元素apple、orange、grape和banana全部被打印出来了,因此可以说明使用<c:forEach>标签可以迭代数组中的元素。
2、使用标签迭代Map集合
在迭代Map类型的集合时,迭代出的每个元素的类型都为Map.Entry,Map.Entry代表Map集合中的一个条目项,其中getKey()方法可获得到条目项的关键字,getValue()方法可获得条目项的值,接下来通过一个案例来演示如何迭代Map集合中的元素,如例2所示。
例2 c_foreach2.jsp
1 <%@ page language="java" contentType="text/html; charset=utf-8"
2 pageEncoding="utf-8" import="java.util.*"%>
3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4 <html>
5 <head></head>
6 <body>
7 <%
8 Map userMap = new HashMap();
9 userMap.put("Tom", "123");
10 userMap.put("Make","123");
11 userMap.put("Lina","123");
12 %>
13 HashMap集合中的元素:<br>
14 <c:forEach var="entry" items="<%=userMap%>">
15 ${entry.key} ${entry.value}<br>
16 </c:forEach>
17 </body>
18 </html>
打开IE浏览器,在地址栏中输入http://localhost:8080/chapter08/c_foreach2.jsp
访问c_ foreach2.jsp页面,此时,浏览器窗口中显示的结果如图2所示。
图2 c_ foreach2.jsp
从图2可以看出,Map集合中存入的用户名和密码全部被打印出来了。在使用<c:forEach>标签时,只需将userMap集合对象赋值给items属性,之后通过entry变量就可以获取到集合中的键和值。
3、使用标签指定迭代集合对象的范围和步长
<c:forEach>标签的begin、end和step属性分别用于指定循环的起始索引、结束索引和步长。使用这些属性可以迭代集合对象中某一范围内的元素,如例3所示。
例3 c_foreach3.jsp
1 <%@ page language="java" contentType="text/html; charset=utf-8"
2 pageEncoding="utf-8" import="java.util.*"%>
3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4 <html>
5 <head></head>
6 <body>
7 colorsList集合(指定迭代范围和步长)<br>
8 <%
9 List colorsList=new ArrayList();
10 colorsList.add("red");
11 colorsList.add("yellow");
12 colorsList.add("blue");
13 colorsList.add("green");
14 colorsList.add("black");
15 %>
16 <c:forEach var="color" items="<%=colorsList%>" begin="1"
17 end="3" step="2">
18 ${color}
19 </c:forEach>
20 </body>
21 </html>
打开IE浏览器,在地址栏中输入http://localhost:8080/chapter08/c_foreach3.jsp
访问c_ foreach3.jsp页面,此时,浏览器窗口中显示的结果如图3所示。
图3 c_ foreach3.jsp
从图3可以看出,浏览器窗口中显示了colorsList集合中的yellow和green两个元素,只显示这两个元素的原因是,在使用<c:forEach>标签迭代List集合时,指定了迭代的起始索引为1,当迭代集合时首先会输出yellow元素,由于在<c:foreach>标签中指定了步长为2,并且指定了迭代的结束索引为3,因此,还会输出集合中的green元素,其它的元素不会再输出。
4、使用标签获取迭代集合中元素的状态信息
<c:foreach>标签的varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含了从集合中取出元素的状态信息。使用<c:foreach>标签的varStatus属性可以获取以下信息:
● count:表示元素在集合中的序号,从1开始计数;
● index:表示当前元素在集合中的索引,从0开始计数;
● first:表示当前是否为集合中的第一个元素;
● last:表示当前是否为集合中的最后一个元素;
通过上面的讲解,大家对<c:forEach>标签的varStatus属性有了基本的了解,接下来通过一个具体的案例来演示如何使用<c:foreach>标签的varStatus属性获取集合中元素的状态信息,如例4所示。
例4 c_foreach4.jsp
1 <%@ page language="java" contentType="text/html; charset=utf-8"
2 pageEncoding="utf-8" import="java.util.*"%>
3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4 <html>
5 <head></head>
6 <body style="text-align: center;">
7 <%
8 List userList = new ArrayList();
9 userList.add("Tom");
10 userList.add("Make");
11 userList.add("Lina");
12 %>
13 <table border="1">
14 <tr>
15 <td>序号</td>
16 <td>索引</td>
17 <td>是否为第一个元素</td>
18 <td>是否为最后一个元素</td>
19 <td>元素的值</td>
20 </tr>
21 <c:forEach var="name" items="<%=userList%>" varStatus="status">
22 <tr>
23 <td>${status.count}</td>
24 <td>${status.index}</td>
25 <td>${status.first}</td>
26 <td>${status.last}</td>
27 <td>${name}</td>
28 </tr>
29 </c:forEach>
30 </table>
31 </body>
32 </html>
打开IE浏览器,在地址栏中输入http://localhost:8080/chapter08/c_foreach4.jsp
访问c_ foreach4.jsp页面,此时,浏览器窗口中显示的结果如图4所示。
图4 c_ foreach4.jsp
从图4可以看出,使用<c:forEach>标签在迭代集合中的元素时,可以通过varStatus属性获取集合中元素的序号和索引,而且还可以判断集合中的元素是否为第一个元素以及最后一个元素。因此可以说明使用该属性可以很方便的获取集合中元素的状态信息。