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

时间:2021-10-13 17:53:14

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

我的实现:

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

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.leslie.SysMenu"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<c:forEach var="parentMenu" items="${parentMenus}">
<c:set var="key" value="${parentMenu.sysMenuId}${''}" scope="request"></c:set>
<c:set var="sms" value='${subMenus[key]}' scope="request"></c:set>
<%-- <c:out value="${fn:length(subMenus[key])}"/> --%>
<c:choose>
<c:when test='${not empty sms and fn:length(sms) > 0}'>
<li><a class="MenuBarItemSubmenu" href="${parentMenu.url}" target="ff">${parentMenu.title}</a>
<ul>
<c:forEach var="sm" items="${sms}">
<c:set var="parentMenus" value="${sms}" scope="request" />
<c:import url="recursionMenu.jsp" />
</c:forEach>
</ul></li>
</c:when>
<c:otherwise>
<li><a href="#" target="ff">${parentMenu.title}</a></li>
</c:otherwise>
</c:choose>
</c:forEach>

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

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

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

 <div class="leftmenu">
2  <ul id="MenuBar1" class="MenuBarVertical">
3    <c:import url="recursionMenu.jsp" />
4  </ul>
</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不对取到了值,所以菜单会重复。