在jstl标签中foreach标签会被经常使用##
- 通常使用foreach标签是用来遍历后端传来的数据
- foreach单个遍历比较简单,了解其用法就可以使用了
foreach嵌套遍历有两种思路
- 先明确要实现的要求,有利于更好的理解foreach嵌套遍历
- 要求:在一个页面下有多个相册,每个相册有多张图片(1对n)
- 即我们要先foreach对相册进行遍历,再再相册中foreach对图片进行遍历,其中对图片遍历要根据相册的信息,不同相册有不同图片。
第一种思路
- 不同相册有不同图片,我们可以在request.setAttribute(“photos”+album.getAlbumId(),photos);加入相册的ld,页面第二个foreach根据不同id遍历不同相册
AlbumService albumService=new AlbumServiceImpl();
List<Album> albumList= albumService.getAlbumsByUserId(user.getUserId());
for(Album album :albumList){
PhotoService photoService =new PhotoServiceImpl();
List<Photo> photos=photoService.getPhotosByAlbumId(album.getAlbumId());
int count=photoService.getCountByAlbumId(album.getAlbumId());
request.setAttribute("photos"+album.getAlbumId(),photos);
}
request.setAttribute("albumList",albumList);
实际情况不可行
主要问题:在foreach中items的值没办法拼接(也就是没办法拼接字符串)###
- 我自己进行了很多尝试及百度搜索(百度里对items拼接问题基本没有)
###自己总结原因:###
- 有可能jstl标签可能不支持字符串拼接
- 有可能sp虽然支持java语句但没办法java语句在jstl标签属性中使用
- 有可能foreach中的items只能是完整的字符串,不能拼接。
##第二种思路(简单有效) ##
- 把嵌套的数据进行封装变成album类List集合photo属性
public class AlbumVO {
private Integer albumId;
private String albumName;
private Integer userId;
private String introduce;
private Integer count;
private List<Photo> photos;
//get和set方法省略了
}
后台
AlbumService albumService=new AlbumServiceImpl();
List<Album> albumList= albumService.getAlbumsByUserId(user.getUserId());
System.out.println(albumList);
List<AlbumVO> albumVOS=new ArrayList<>();
//这里可以用jdk1.7以后的类拷贝,可以少些代码
for(Album album :albumList){
AlbumVO albumVO=new AlbumVO();
albumVO.setAlbumId(album.getAlbumId());
albumVO.setAlbumName(album.getAlbumName());
albumVO.setIntroduce(album.getIntroduce());
albumVO.setUserId(album.getUserId());
PhotoService photoService =new PhotoServiceImpl();
List<Photo> photos=photoService.getPhotosByAlbumId(album.getAlbumId());
int count=photoService.getCountByAlbumId(album.getAlbumId());
albumVO.setPhotos(photos);
albumVO.setCount(count);
albumVOS.add(albumVO);
//request.setAttribute("photos"+album.getAlbumId(),photos);
}
request.setAttribute("albumList",albumVOS);
jstl的foreach标签items直接写album.photos就行了
即实现了foreach嵌套循环
<c:forEach var="album" items="${albumList}" varStatus="index">
<div class="albums-tab">
<div class="albums-tab-thumb sim-anim-9">
<c:forEach var="photo" items="${album.photos}">
<img src="http://localhost:8080/img/${photo.photoUrl}" class="all studio"/>
</c:forEach>
</div>
<div class="albums-tab-text">${album.albumName}<span>(${album.introduce})</span></div>
</div>
</c:forEach>