本文参考了其他文章,如若侵权请联系我
jstl标签中的foreach循环加上EL表达式能够写出简洁的页面,可在由于标签和JAVABean的局限性,一个循环里面只有一个循环体,不能同时多个表达。但可以通过一些技巧来避开这劣势。
第一种:容器里面放着容器
<%
ArrayList<ArrayList> ayList = new ArrayList<>();
for(int i=0;i<3;i++){
ArrayList <String>dataList = new ArrayList();
for( int j=0;j<3;j++){
String s = "tr"+i+"td"+j;
dataList.add(s);
}
ayList.add(dataList);
}
request.setAttribute("list",ayList);
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="list" class="java.util.ArrayList" ></jsp:useBean>
<html>
<head>
</head>
<center>
<table width="750" height="60" cellpadding="20" cellspacing="20" border = "0" >
<tr>
<c:forEach items="${list}" var="datalist" varStatus="LoopParam" >
<td>
<c:foreach items="${datalist}" varStatus="dataStatus" var ="data">
<c:out value="${data}"/>
</td>
<td>
</c:foreach>
</tr>
<tr>
</c:forEach>
</tr>
</table>
</center>
</body>
</html>
第二种:两个无关联的Bean之间嵌套循环显示
因为foreach只能有一个循环体,所以不能同时放两个bean进去显示。但可以通过map来实现两个bean之间的映射。
<%
ArrayList<String> list = new ArrayList<>();
list.add("John");
list.add("Lisa");
list.add("Tony");
Map <String,ArrayList>reflect = new HashMap<String,List>();
for(int i=0;i<list.size();i++){
ArrayList<String> data = new ArrayList<String>();
for(int j=0;j<3;j++){
String value = "value:"+(i*3+j);
data.add(value);
}
reflect.put("option"+i,data);
}
request.addAttribute("list",list);
request.addAttribute("map",reflect);
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="list" class="java.util.ArrayList" ></jsp:useBean>
<jsp:userBean id="map" class="java.util.HaspMap"/>
<html>
<head>
</head>
<center>
<table width="750" height="60" cellpadding="20" cellspacing="20" border = "0" >
<tr>
<c:forEach items="${list}" var="lt" varStatus="listStatus" >
<c:out value="${lt}"/>
<td>
<c:set value="${'value'}${listStatus.count-1} var = "num"/>
<c:foreach items="${map[num]}" varStatus="dataStatus" var ="data">
<c:out value="${data}"/>
</td>
<td>
</c:foreach>
</tr>
<tr>
</c:forEach>
</tr>
</table>
</center>
</body>
</html>