先来看一下效果吧:
第3、4行最后两个数据是合并的,所以说它不规则。
进入正题,我们来看看数据源:
public class LadingInfo implements Serializable{
//.........
private List<LadingDetail> ladingDetailList;
}
public class LadingDetail implements Serializable{
//...................
}
ladingInfo类以ladingDetail类的对象集合的list类型的属性,在数据库中对应了两张表,一下是service层代码:
for (String id : ids) {
LadingInfo ladingInfo= dao.getLadingInfoById(id);
List<LadingDetail> ladingDetailList = dao.findLadingDetailListByLadingId(id);
ladingInfo.setLadingDetailList(ladingDetailList);
ladingList.add(ladingInfo);
}
}
//controller往jsp返回数据
model.addAttribute("ladingInfoList",ladingInfoList);
小结一下:一个ladingList有很多ladingInfo对象,一个ladingInfo对象有很多ladingDetail对象,ladingDetail作为ladingInfo的属性存储就是一个list集合了。
现在来说说怎么把ladingList这个list中的数据遍历在表中显示出来:
1 <c:forEach items="${ladingInfoList}" var="lading" varStatus="p">
2 <tr>
3 <c:forEach items="${lading.ladingDetailList}" var="detail" varStatus="pd">
4 <c:set var="orderSize" value="${fn:length(lading.ladingDetailList)}"></c:set>
5 <c:if test="${pd.index gt 0 }">
6 <tr>
7 </c:if>
8 <td>${detail.maktx} </td>
9 <td>${lading.consigneeAddress} </td>
10 <td>${lading.consigneeCompany} </td>
11 <c:if test="${pd.index eq 0 }">
12 <td rowspan="${orderSize>0?orderSize:1}"> </td>
13 <td rowspan="${orderSize>0?orderSize:1}">${lading.ladingCode}</td>
14 </c:if>
15 <c:if test="${pd.index gt 0 }">
16 </tr>
17 </c:if>
18 </c:forEach>
19 </tr>
20</c:forEach>
解释一下:先循环最外面的ladingInfoList,再循环每个对象的list集合属性;
第4行定义了一个orderSize,这是最后合并列用的参数,在12行用到了;
第5行是说,如果大对象(ladingInfo)的list集合的长度大于0时,这里的index是从0开始计算(参见:https://blog.csdn.net/qq_39767955/article/details/82691125),也就是说list里面有两个以上ladingDetail类的对象时,就增加一个<tr>;
8,9,10行是显示数据(精简的部分代码,不影响整体效果),第10行是说,当前循环list是第一次时(因为这里的pd.index 等于0),那么就显示ladingInfo大对象的数据,并做行合并处理。
15行和以后的用过不用解释了,都很简单的。
ps:如果你学会了,并喜欢我的博客,请关注,点赞,留言,Thanks♪(・ω・)ノ。写了这么多博客都没有人关注,好气呀。