在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不对取到了值,所以菜单会重复。