在jsp中使用jstl,不使用JS,实现递归,生成N级菜单

参考材料:  http://blog.csdn.net/kimsoft/article/details/7801564

我的实现:

1、我的recursionMenu.jsp代码如下:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ page import="com.leslie.SysMenu"%>
 4 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 5 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
 6 <c:forEach var="parentMenu" items="${parentMenus}">
 7     <c:set var="key" value="${parentMenu.sysMenuId}${''}" scope="request"></c:set>
 8     <c:set var="sms" value='${subMenus[key]}' scope="request"></c:set>
 9     <%-- <c:out value="${fn:length(subMenus[key])}"/> --%>
10     <c:choose>
11         <c:when test='${not empty sms and fn:length(sms) > 0}'>
12             <li><a class="MenuBarItemSubmenu" href="${parentMenu.url}" target="ff">${parentMenu.title}</a>
13                 <ul>
14                     <c:forEach var="sm" items="${sms}">
15                         <c:set var="parentMenus" value="${sms}" scope="request" />
16                         <c:import url="recursionMenu.jsp" />
17                     </c:forEach>
18                 </ul></li>
19         </c:when>
20         <c:otherwise>
21             <li><a href="#" target="ff">${parentMenu.title}</a></li>
22         </c:otherwise>
23     </c:choose>
24 </c:forEach>

2、页面说明:${parentMenus}是后台返回的一个List,存储着父一级的菜单对象。${subMenus}是后台返回的一个Map,key是菜单的id,value是该菜单的直属子菜单对象组成的List,这个Map将所有当前用户拥有权限的菜单

都组织好了,可见它存储着多个层级菜单的内容。

3、外层调用recursionMenu.jsp的页面的代码节选

1 <div class="leftmenu">
2  <ul id="MenuBar1" class="MenuBarVertical">
3    <c:import url="recursionMenu.jsp" />
4  </ul>
5 </div>

4、关键点:

(1)如何实现递归:jsp使用<c:import>标签,自己import自己,来实现递归。

(2)

<c:set var="key" value="${parentMenu.sysMenuId}${''}" scope="request"></c:set>
<c:set var="sms" value='${subMenus[key]}' scope="request"></c:set>

这两行的变量定义语句中,如果将scope="request"这一句去掉的话,生成的二级菜单会出现重复,因为如果变量的定义范围超出了request的话,key和sms就会混乱,造成本应该从${subMenus}中应该取不到值,
却因为key不对取到了值,所以菜单会重复。

posted on 2016-05-12 12:08  izumi  阅读(4236)  评论(0编辑  收藏  举报

导航