总结之jstl标签:c:foreach嵌套循环的实现——(items值处理)

在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>

猜你喜欢

转载自blog.csdn.net/IManiy/article/details/82558376
今日推荐