9.3.7 <c:forEach>標籤
<c:forEach>標籤用於根據集合對象或指定的次數循環迭代標籤體中的內容。在使用<c:forEach>標籤時應注意以下幾點:
若是指定begin屬性,該屬性的值必須大於或等於0,不然會拋出javax.servlet.jsp.JspTagException異常。
若是指定end屬性,該屬性的值不能小於begin屬性的值,不然不會進行迭代操做。
若是指定step屬性,該屬性的值必須大於或等於1,不然會拋出javax.servlet.jsp.JspTagException異常。
若是items屬性的值爲null,或items屬性指定的集合對象不存在,items屬性值將被做爲一個空集合對待。<c:forEach>標籤不會進行迭代操做。
若是begin屬性值大於或等於集合對象的元素個數,則不會進行迭代操做。
若是begin屬性值在有效的範圍內,但end屬性值大於或等於集合對象的元素個數,則迭代到集合對象的最後一個元素爲止。
<c:forEach>標籤的items屬性支持以下的數據類型:
任意類型的數組
java.util.Collection
java.util.Iterator
java.util. Enumeration
java.util.Map
String
若是items屬性值是String類型,該字符串必須用逗號(,)分隔。<c:forEach>標籤會將以逗號分隔的字符串看成String數組來處理(每個被逗號分隔的子串至關於String數組中的一個元素)。
1. 迭代數組
forEach_array.jsp頁面是一個使用<c:forEach>標籤迭代數組的例子,代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String[] strArray = new String[]{"超人", "飛機", "神化", "地球"};
int[] intArray = new int[]{100, 200, 320, 400, 1200};
chapter9.Message[] messages = new chapter9.Message[3];
messages[0] = new chapter9.Message();
messages[0].setName("bill");
messages[1] = new chapter9.Message();
messages[1].setName("Mike");
messages[2] = new chapter9.Message();
messages[2].setName("趙明");
// 將數組保存在request域中
request.setAttribute("strArray", strArray);
request.setAttribute("intArray", intArray);
request.setAttribute("messages", messages);
%>
迭代輸出String數組中的元素<br>
<c:forEach var="str" items="${strArray}" >
${str}
</c:forEach>
<hr>
迭代輸出int數組中的元素,並指定begin、end和varStatus屬性<br>
<c:forEach var="int" items="${intArray}" begin = "1" end = "3" varStatus="status" >
intArray[${status.index}]=${int}
</c:forEach>
<hr>
迭代Message對象數組,並經過step屬性指定迭代步長<br>
<c:forEach var="message" items="${messages}" step="2" varStatus="status">
messages[${status.index}].name =${message.name}<br>
</c:forEach>
在瀏覽器地址欄中輸入以下的URL來測試forEach_array.jsp頁面:
http://localhost:8080/demo/chapter9/forEach_array.jsp
2. 迭代Collection和Iterator類型的集合對象
forEach_collection.jsp頁面是一個使用<c:forEach>標籤迭代Collection和Iterator類型的集合對象的例子,代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
java.util.List<Object[]> objList = new java.util.ArrayList<Object[]>();
java.util.Random random = new java.util.Random();
for (int i = 0; i < 7; i++)
{
Object[] objArray = new Object[]
{ "隨機數" + String.valueOf(i + 1), random.nextInt(10000) };
objList.add(objArray);
}
// 將Collection和Iterator類型的集合對象保存在request域中
request.setAttribute("objList", objList);
request.setAttribute("objIterator", objList.iterator());
%>
<table width="100%">
<tr>
<td align="right" style="padding-right: 20px">
<table border="1">
<tr>
<th>名稱</th>
<th>隨機數</th>
</tr>
<!-- 迭代Collection類型的集合對象 -->
<c:forEach var="obj" items="${objList}">
<tr>
<td>${obj[0]}</td>
<td>${obj[1]}</td>
</tr>
</c:forEach>
</table>
</td>
<td style="padding-left: 20px">
<table border="1">
<tr>
<th>隨機數</th>
<th>名稱</th>
</tr>
<!-- 迭代Iterator類型的集合對象 -->
<c:forEach var="obj" items="${objIterator}" >
<tr>
<td>${obj[1]}</td>
<td>${obj[0]}</td>
</tr>
</c:forEach>
</table>
</td>
</tr>
</table>
在瀏覽器地址欄中輸入以下的URL來測試forEach_collection.jsp頁面:
http://localhost:8080/demo/chapter9/forEach_collection.jsp
3. 使用雙重循環迭代Enumeration類型的集合對象和數組
forEach_enumeration.jsp頁面是一個使用<c:forEach>標籤迭代Enumeration類型的集合對象和數組的例子。內層循環迭代數組,外層循環迭代Enumeration類型的集合,代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
java.util.Vector v = new java.util.Vector();
String[] strArray = new String[]
{ "超人", "飛機", "神化", "地球" };
int[] intArray = new int[6];
java.util.Random random = new java.util.Random();
for (int i = 0; i < intArray.length; i++)
{
intArray[i] = random.nextInt(123456);
}
v.add(strArray);
v.add(intArray);
// 將Enumeration對象保存在request域中
request.setAttribute("elements", v.elements());
%>
使用雙重循環輸出Enumeration對象中的值<hr>
<!-- 迭代Enumeration集合對象 -->
<c:forEach var="element" items="${elements}">
<!-- 迭代Enumeration集合對象中的元素,每個元素是一個數組 -->
<c:forEach var="value" items="${element}">
${value}
</c:forEach>
<br>
</c:forEach>
Vector對象的elements方法返回了一個Enumeration對象。該對象描述了Vector對象中的全部元素。
在瀏覽器地址欄中輸入以下的URL來測試forEach_enumeration.jsp頁面:
http://localhost:8080/demo/chapter9/forEach_enumeration.jsp
4. 迭代Map類型的集合對象
foreach_map.jsp頁面是一個使用<c:forEach>標籤迭代Map類型的集合對象的例子,代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
java.util.Map<String, Integer> map = new java.util.HashMap<String, Integer>();
map.put("自行車", 23);
map.put("皮球", 20);
map.put("電腦", 120);
// 將Map對象保存在request域中
request.setAttribute("map", map);
%>
<br>
<center>迭代輸出Map對象中的key-value對<p/>
<table border="1">
<tr>
<th>商品</th>
<th>數量</th>
</tr>
<!-- 迭代Map類型的集合對象 -->
<c:forEach var="entry" items="${map}">
<tr>
<!-- 輸出集合元素的key -->
<td>${entry.key}</td>
<!-- 輸出集合元素的value -->
<td>${entry.value}</td>
</tr>
</c:forEach>
</table>
</center>
在瀏覽器地址欄中輸入以下的URL來測試forEach_map.jsp頁面:
http://localhost:8080/demo/chapter9/forEach_map.jsp
5. 迭代用逗號(,)分隔的字符串
<c:forEach>標籤除了能夠迭代各類類型的集合對象和數組外,還能夠迭代用逗號分隔的字符串。但要注意,分隔符必須是逗號。forEach_string.jsp頁面是一個使用<c:forEach>標籤迭代以逗號分隔的字符串的例子,代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<center>
<table border="1">
<tr>
<!-- 迭代用逗號分隔的字符串 -->
<c:forEach var="s" items="超人, 飛機, 神化, 地球">
<td>${s}</td>
</c:forEach>
</tr>
</table>
</center>
在瀏覽器地址欄中輸入以下的URL來測試forEach_string.jsp頁面:
http://localhost:8080/demo/chapter9/forEach_string.jsp
6. 得到當前迭代元素的狀態信息
經過<c:forEach>標籤的status屬性能夠指定保存當前迭代元素狀態信息的對象名。該對象被保存在page屬性。這個對象實際上就是javax.servlet.jsp.jstl.core.LoopTagStatus對象實例。在LoopTagStatus接口有以下幾個方法能夠得到當前迭代元素的狀態信息:
public Object getCurrent():該方法返回當前迭代的元素對象。
public int getCount():該方法返回當前已循環迭代的次數。
public int getIndex():該方法返回當前迭代的元素索引號。
public boolean isFirst():若是當前迭代元素是迭代集合對象的第一個元素,該方法返回true,不然返回false.
public boolean isLast():若是當前迭代元素是迭代集合對象的最後一個元素,該方法返回true,不然返回false.
public Integer getBegin():該方法返回<c:forEach>標籤的begin屬性值。若是未設置begin屬性,則返回null.
public Integer getEnd():該方法返回<c:forEach>標籤的end屬性值。若是未設置end屬性,則返回null.
public Integer getStep():該方法返回<c:forEach>標籤的step屬性值。若是未設置step屬性,則返回null.
forEach_status.jsp頁面是一個使用<c:forEach>標籤輸出當前迭代元素狀態信息的例子,代碼以下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String[] strArray = new String[]{ "超人", "飛機", "神化", "地球" };
// 將數組保存在request域中
request.setAttribute("strArray", strArray);
%>
<center>
未設置begin、end和step屬性<p/>
<table border="1">
<tr>
<th>當前迭代元素</th>
<th>current</th>
<th>count</th>
<th>index</th>
<th>first</th>
<th>last</th>
<th>begin</th>
<th>end</th>
<th>step</th>
</tr>
<c:forEach var="s" items="${strArray}" varStatus="status">
<tr>
<td>${s}</td>
<td>${status.current}</td>
<td>${status.count}</td>
<td>${status.index}</td>
<td>${status.first}</td>
<td>${status.last}</td>
<td>${status.begin}</td>
<td>${status.end}</td>
<td>${status.step}</td>
</tr>
</c:forEach>
</table>
<hr>
設置了begin、end和step屬性<p/>
<table border="1">
<tr>
<th>當前迭代元素</th>
<th>current</th>
<th>count</th>
<th>index</th>
<th>first</th>
<th>last</th>
<th>begin</th>
<th>end</th>
<th>step</th>
</tr>
<c:forEach var="s" items="${strArray}" varStatus="status" begin = "1" end = "3" step="2">
<tr>
<td>${s}</td>
<td>${status.current}</td>
<td>${status.count}</td>
<td>${status.index}</td>
<td>${status.first}</td>
<td>${status.last}</td>
<td>${status.begin}</td>
<td>${status.end}</td>
<td>${status.step}</td>
</tr>
</c:forEach>
</table>
</center>
在瀏覽器地址欄中輸入以下的URL來測試forEach_status.jsp頁面:
http://localhost:8080/demo/chapter9/forEach_status.jsp
7. 設置表格偶數行的背景色
使用迭代元素狀態信息對象的屬性能夠實現不少有趣的功能。如使用count屬性能夠實現改變表格的偶數行背景色的功能,代碼以下:
<!-- forEach.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
java.util.Map<String, Integer[]> map =
new java.util.HashMap<String, Integer[]>();
map.put("自行車", new Integer[]{ 321, 23 });
map.put("皮球", new Integer[]{ 45, 20 });
map.put("電腦", new Integer[]{ 4320, 120 });
map.put("啤酒", new Integer[]{ 3, 320 });
map.put("照相機", new Integer[]{ 1200, 12 });
// 將Map對象保存在request域中
request.setAttribute("map", map);
%>
<br>
<center>設置表格偶數行的背景色<p/>
<table border="1" width="80%">
<tr>
<th>商品</th>
<th>單價</th>
<th>數量</th>
</tr>
<!-- 迭代Map類型的集合對象 -->
<c:forEach var="entry" items="${map}" varStatus="status">
<!-- 使用EL判斷count屬性值是否爲偶數,以便設置偶數行的背景色 -->
<tr ${status.count % 2 == 0? 'style="
<!-- 輸出集合元素的key -->
<td>${entry.key}</td>
<!-- 輸出集合元素的value中的第一個元素 -->
<td>${entry.value[0]}</td>
<!-- 輸出集合元素的value中的第二個元素 -->
<td>${entry.value[1]}</td>
</tr>
</c:forEach>
</table>
</center>
在上面的代碼中,使用了EL表達式判斷了count屬性值是否爲偶數(不包括表頭)。若是count屬性值爲偶數,則使用CSS設置了偶數行的背景色。
在瀏覽器地址欄中輸入以下的URL:
http://localhost:8080/demo/chapter9/forEach.jsp
瀏覽器的顯示效果如圖9.2所示。
![圖9.2 設置表格偶數行的背景色](http://static.javashuo.com/static/loading.gif)
圖9.2 設置表格偶數行的背景色