参考材料:  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不对取到了值,所以菜单会重复。

在jsp中使用jstl,不使用JS,实现递归,生成N级菜单的更多相关文章

  1. 【JSP中引入文件】JSP中获取根路径+引用js文件

    在jsp界面中经常需要引入js.css等文件,通常都需要先获取项目根路径,然后再引入文件. 例如: 项目路径如下,需要在index.jsp中引入FusionCharts相关的js.css等: inde ...

  2. JSP中获取jstl中的数据

    我们在编程JSP时,有时会须要訪问jstl中的数据,或者说是el表达式中的数据. 比方, <c:forEach    varStatus="data1" var=" ...

  3. 【转】JSP中的JSTL与EL表达式用法及区别

    对于JSTL和EL之间的关系,这个问题对于初学JSP的朋友来说,估计是个问题,下面来详细介绍一下JSTL和EL表达式他们之间的关系,以及JSTL和EL一些相关概念! EL相关概念JSTL一般要配合EL ...

  4. jsp中的JSTL与EL表达式用法

    JSTL (JSP Standard Tag Library ,JSP标准标签库) JSTL标签库分为5类:JSTL核心标签库.JSTL函数标签库.数据库标签库.I18N格式化标签库.XML标签库. ...

  5. jsp中的JSTL与EL表达式用法及区别

    对于JSTL和EL之间的关系,这个问题对于初学JSP的朋友来说,估计是个问题,下面来详细介绍一下JSTL和EL表达式他们之间的关系,以及JSTL和EL一些相关概念! EL相关概念 JSTL一般要配合E ...

  6. JSP中利用JSTL标签对日期格式化

    数据库:Mysql 开发语言:JAVA 页面类型:JSP 对Mysql中的日期类型格式化,在JSP中,如何办呢,很多人说在JAVA后台去日期格式化,无奈了,于是找到了比较靠谱的答案 需要先引入JSTL ...

  7. JSP中使用JSTL表达式

    最近写web项目,为了使JSP代码美观好维护,决定采用EL&JSTL表达式.    EL表达式直接就可以用,但是JSTL表达式是属于apache的一个开源库,这个用起来就需要倒入一些jar包之 ...

  8. JSP中常用JSTL用法

    使用标签时,需要在jsp文件头加入以下代码: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/cor ...

  9. js利用递归生成随机数填充到数组

    用递归算法实现,数组长度为5且元素的随机数在2-32间不重复的值 var  array = new Array(5); function addNumToArray(array,num){     i ...

随机推荐

  1. [Linux]如何查看系统的Time Slice

    Linux Time Slice 首先,.config中查看kernel configure中CONFIG_HZ值,比如100 然后,查看include/linux/sched/rt.h或者inclu ...

  2. JQuery Table 合并单元格-解决Bug版本

    网络中提供的方法是: <script type="text/javascript"> function _w_table_rowspan(_w_table_id, _w ...

  3. python List的一些相关操作

    把一些基础的东西归类整理,作记录. 添加元素 a=[7,8,9,10] a.append('a') #在最后位置添加 a.insert(1,'b') #在指定位置添加     删除元素 del a[1 ...

  4. SpringCloud 详解配置刷新的原理 使用jasypt自动加解密后 无法使用 springcloud 中的自动刷新/refresh功能

    之所以会查找这篇文章,是因为要解决这样一个问题: 当我使用了jasypt进行配置文件加解密后,如果再使用refresh 去刷新配置,则自动加解密会失效. 原因分析:刷新不是我之前想象的直接调用conf ...

  5. PCL深度图像(1)

    目前深度图像的获取方法有激光雷达深度成像法,计算机立体视觉成像,坐标测量机法,莫尔条纹法,结构光法等等,针对深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基 ...

  6. HashTable和HashMap的区别详解

    一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...

  7. Python 内置方法new

    class Dog(object): def __new__(self): print("i am new .") def __init__(self): print(" ...

  8. Java HashSet和HashMap源码剖析

    转自: Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...

  9. SNMP MIB库

    -- mib文件的开头指定文件名,并且使用BEGIN开始,文件的最后用END结束 -- IMPORTS就相当与c语言中的include,包含需要使用的一些数据类型 -- 通过FROM指定引用的来源 M ...

  10. e796. 设置JSlider的方向

    Besides being either horizontal or vertical, a slider can also be inverted. An inverted horizontal s ...