Map<Long, List<BookType>> map = ..........
map.put(0,list0);
map.put(1,list1);
map.put(2,list2);
前台静态读取并遍历:
<c:forEach items="${applicationScope.booktypes[0] }" var="type" varStatus="status" >
</c:forEach>
前台动态读取并遍历:
<c:set var="secKey" value="${type.id+0 }" /> //注意该处的+0不能省略。。。。
//另外 如果将+0改为+""是否可以将Key定义为string类型照常可以使用?鄙人暂时没有测试。。。。
<c:forEach items="${applicationScope.booktypes[secKey] }" var="secType" varStatus="secStatus" >
<a class="contentBook">${secType.name }</a>
</c:forEach>
在这里我利用该方法,完成一个二级目录的存取,读取,显示
后台
//代码是ServletContext的初始化方法,在JSP中称之为application
@Override
public void contextInitialized(ServletContextEvent event) {
Map<Long, List<BookType>> map = new HashMap<Long, List<BookType>>();
fillMap(0L, map);
event.getServletContext().setAttribute("booktypes", map);;
}
// 通过对数据库读取,将不同级别的目录名字存放在 (递归)
//Map<Long, List<BookType>> map = new HashMap<Long, List<BookType>>();
// 的map变量中
//由于递归的存在,所以 你可以实现任意长度的目录,但是一般3级目录应该够用了
/**
* 通过map存储树状图的结构
* @param pid
* @return
*/
private static void fillMap(Long pid, Map<Long, List<BookType>> map) {
// 获取数据库相关的数据
List<BookType> booktypes = FactoryDao.getBookTypeDao().getListByPid(pid);
// 判断数据库是否存在该数据
if(null != booktypes && booktypes.size() > 0) {
// 数据写入map
map.put(pid, booktypes);
for (BookType bookType : booktypes) {
fillMap(Long.valueOf(bookType.getId()), map);
}
}
}
前台读取目录
// 静态读取 一级目录 特点是 pid = 0 的目录
<c:forEach items="${applicationScope.booktypes[0] }" var="type" varStatus="status" >
<c:if test="${status.count <= 10}">
<li>
<div class="leftShow">
<span class="bookType"><b>${type.name}</b></span>
// 动态读取 子目录: 子目录 当时存放为 map(pid, list<BookType>) pid 为上级目录的 id
当前需要取出id 去找子目录
<c:set var="secKey" value="${type.id+0 }" />
<c:forEach items="${applicationScope.booktypes[secKey] }" var="secType" varStatus="secStatus" >
<c:if test="${secStatus.count <= 6}">
<a class="contentBook">${secType.name }</a>
</c:if>
</c:forEach>
</div>
</li>
</c:if>
</c:forEach>
在这里 只实现了两级目录, 如果要实现不定级目录,很可能要用到递归