树形递归这中需求,虽然在系统中不是出现频率很高的功能,可是倒是大多数系统,又比不可少的一个内容。最近在研究和使用thymeleaf这个模板引擎,发现是真的好用,比原来的jsp和freemark的功能强大使用有又比较轻,特别是他是真正能够作到脱离后台程序开发的页面原型的模板引擎。 好了,说了这么多也就是想然你对这个东西产生一点兴趣。像在页面现实树形菜单这个需求,我竟然在百度里面,没有百度出别人分享的案例(ps多是我百度的水平太low了吧。。。。)。因此,没办法,只好本身研究了。less
下面是我研究出来的成果。主要是使用到了thymeleaf的fragment功能。jsp
其余的也很少说,只贴代码,剩余的能够自行研究:ui
主体部分:this
<table class="layui-table"> <colgroup> <col width="200"> <col width="150"> <col width="150"> <col width="150"> <col width="150"> <col width="150"> <col width="150"> <col> </colgroup> <thead> <tr> <th>名称</th> <th>标识</th> <th>类型</th> <th>权限资源</th> <th>描述</th> <th>状态</th> <th>排序</th> <th style="text-align: center;">操做</th> </tr> </thead> <tbody th:include="this::row(${permissions},1)"/> </table>
模板递归部分url
<!--局部模板--> <th:block th:fragment="row(permissions,lv)"> <th:block th:each="p : ${permissions}"> <tr> <td th:text="${p.name}" th:style="|padding-left:${15*lv}px|">名称</td> <td th:text="${p.key}">标识</td> <td th:text="${p.type.display}">权限类型</td> <td th:text="${p.url}">权限资源</td> <td th:text="${p.description}">描述</td> <td th:text="${p.enable?'可用':'禁用'}">是否启用</td> <td th:text="${p.weight}">权重</td> <td style="text-align: center;"> <div class="layui-btn-group"> <a class="layui-btn layui-btn-mini"><i class="layui-icon"></i></a> <a class="layui-btn layui-btn-danger layui-btn-mini"><i class="layui-icon"></i></a> </div> </td> </tr> <th:block th:unless="${#lists.isEmpty(p.children)}" th:include="this::row(${p.children},${lv+1})"/> </th:block> </th:block>
注意两个地方: 此处是调用片断,下面就是定义片断。lists.isEmpty(p.children)就是判断是否须要递归code
<tbody th:include="this::row(${permissions},1)"/>