Freemarker如何生成树形导航菜单(递归)

发布时间 - 2026-01-11 03:20:13    点击率:

很多导航菜单是树形的,即一级一级往下分,这样的结构固然需要用递归来处理。

对于Freemarker 来说,宏就相当于函数,其定义了签名及参数列表。

所以在freemarker页面应这样写:

<#macro menuTree menus> 
  <#if menus?? && menus?size gt 0> 
   <#list menus as menu> 
    <tr> 
     <td> 
      <input type="checkbox" name="ids" value="${menu.id}" /> 
     </td> 
     <td> 
   <span title="${menu.name!}" style="margin-left: ${menu.leaf * 30}px;[#if menu.leaf == 0] color: #000000;[/#if]"> 
   ${menu.menuName!} 
   </span> 
     </td> 
     <td> 
     ${menu.url!} 
     </td> 
     <td> 
     ${menu.permissionText!} 
     </td> 
     <td> 
     ${menu.sortNo!} 
     </td> 
     <td> 
      <a href="edit.jhtml?id=${menu.id}">[编辑]</a> 
     </td> 
    </tr> 
   <#if menu.menuBeans?? && menu.menuBeans?size gt 0> 
    <@menuTree menus = menu.menuBeans/> 
   </#if> 
   </#list> 
  </#if> 
 </#macro> 
 <!-- 调用宏 生成递归树 --> 
<@menuTree menus = dto /> 

后台数据:

[ 
 { 
  "id": 1, 
  "enable": true, 
  "remark": null, 
  "createBy": 1, 
  "createTime": 1503546411000, 
  "updateBy": 1, 
  "updateTime": 1503546415000, 
  "keyword": null, 
  "menuName": "系统管理", 
  "menuType": 1, 
  "parentId": null, 
  "iconcls": null, 
  "url": null, 
  "expand": null, 
  "sortNo": null, 
  "permission": null, 
  "moduleId": 1, 
  "parentName": null, 
  "leaf": 0, 
  "typeName": null, 
  "permissionText": null, 
  "menuBeans": [ 
   { 
    "id": 7, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "模块管理", 
    "menuType": 1, 
    "parentId": 1, 
    "iconcls": null, 
    "url": "/module/list", 
    "expand": null, 
    "sortNo": null, 
    "permission": null, 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   }, 
   { 
    "id": 3, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "菜单管理", 
    "menuType": 1, 
    "parentId": 1, 
    "iconcls": null, 
    "url": "/menu/list", 
    "expand": null, 
    "sortNo": null, 
    "permission": "admin:add", 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   } 
  ] 
 }, 
 { 
  "id": 2, 
  "enable": true, 
  "remark": null, 
  "createBy": 1, 
  "createTime": 1503546411000, 
  "updateBy": 1, 
  "updateTime": 1503546415000, 
  "keyword": null, 
  "menuName": "用户管理", 
  "menuType": 1, 
  "parentId": null, 
  "iconcls": null, 
  "url": null, 
  "expand": null, 
  "sortNo": null, 
  "permission": null, 
  "moduleId": 1, 
  "parentName": null, 
  "leaf": 0, 
  "typeName": null, 
  "permissionText": null, 
  "menuBeans": [ 
   { 
    "id": 9, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "供应商管理", 
    "menuType": 1, 
    "parentId": 2, 
    "iconcls": null, 
    "url": null, 
    "expand": null, 
    "sortNo": null, 
    "permission": null, 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   }, 
   { 
    "id": 8, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "部门管理", 
    "menuType": 1, 
    "parentId": 2, 
    "iconcls": null, 
    "url": null, 
    "expand": null, 
    "sortNo": null, 
    "permission": null, 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   }, 
   { 
    "id": 6, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "权限管理", 
    "menuType": 1, 
    "parentId": 2, 
    "iconcls": null, 
    "url": "/user/list-6", 
    "expand": null, 
    "sortNo": null, 
    "permission": null, 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   }, 
   { 
    "id": 5, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "角色管理", 
    "menuType": 1, 
    "parentId": 2, 
    "iconcls": null, 
    "url": "/user/list-5", 
    "expand": null, 
    "sortNo": null, 
    "permission": null, 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   }, 
   { 
    "id": 4, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "分销商管理", 
    "menuType": 1, 
    "parentId": 2, 
    "iconcls": null, 
    "url": "/user/add-4", 
    "expand": null, 
    "sortNo": null, 
    "permission": null, 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   }, 
   { 
    "id": 10, 
    "enable": true, 
    "remark": null, 
    "createBy": 1, 
    "createTime": 1503546411000, 
    "updateBy": 1, 
    "updateTime": 1503546415000, 
    "keyword": null, 
    "menuName": "员工管理", 
    "menuType": 1, 
    "parentId": 2, 
    "iconcls": null, 
    "url": null, 
    "expand": null, 
    "sortNo": null, 
    "permission": null, 
    "moduleId": 1, 
    "parentName": null, 
    "leaf": 1, 
    "typeName": null, 
    "permissionText": null, 
    "menuBeans": null 
   } 
  ] 
 } 
] 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Freemarker生成树形导航菜单  # Freemarker树形导航菜单  # Freemarker导航菜单  # freemarker判断对象是否为空的方法  # freemarker 数字格式化深入理解  # java Spring整合Freemarker的详细步骤  # 使用Java进行FreeMarker的web模板开发的基础教程  # spring mvc整合freemarker基于注解方式  # 基于Java的Spring框架来操作FreeMarker模板的示例  # Freemarker常用指令使用示例  # FreeMarker配置(Configuration)  # Java操作FreeMarker模板引擎的基本用法示例小结  # Java用freemarker导出word实用示例  # 递归  # 往下  # 需要用  # 大家多多  # input  # td  # checkbox  # type  # list  # size  # tr  # menu  # ids  # left  # margin  # leaf  # span  # id  # style  # title 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  怎样使用JSON进行数据交换_它有什么限制  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  微信小程序 wx.uploadFile无法上传解决办法  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何实现API速率限制?(Rate Limiting教程)  详解Android图表 MPAndroidChart折线图  Laravel如何处理CORS跨域请求?(配置示例)  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  如何在建站之星网店版论坛获取技术支持?  如何用花生壳三步快速搭建专属网站?  再谈Python中的字符串与字符编码(推荐)  清除minerd进程的简单方法  如何快速完成中国万网建站详细流程?  微信小程序 五星评分(包括半颗星评分)实例代码  如何打造高效商业网站?建站目的决定转化率  linux写shell需要注意的问题(必看)  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  个人网站制作流程图片大全,个人网站如何注销?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel如何实现文件上传和存储?(本地与S3配置)  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  轻松掌握MySQL函数中的last_insert_id()  如何在云主机上快速搭建多站点网站?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  敲碗10年!Mac系列传将迎来「触控与联网」双革新  如何快速搭建高效香港服务器网站?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  制作电商网页,电商供应链怎么做?  创业网站制作流程,创业网站可靠吗?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  javascript中的try catch异常捕获机制用法分析  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何在万网开始建站?分步指南解析  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Python图片处理进阶教程_Pillow滤镜与图像增强  UC浏览器如何设置启动页 UC浏览器启动页设置方法  ,网页ppt怎么弄成自己的ppt?  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在IIS服务器上快速部署高效网站?  详解Oracle修改字段类型方法总结  如何登录建站主机?访问步骤全解析  Bootstrap整体框架之CSS12栅格系统  免费视频制作网站,更新又快又好的免费电影网站?