在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不對取到了值,所以菜單會重復。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM