參考材料: 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不對取到了值,所以菜單會重復。
