1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Menu {

// 菜单id

private String id;

// 菜单名称

private String name;

// 父菜单id

private String parentId;

// 菜单url

private String url;

// 菜单图标

private String icon;

// 菜单顺序

private int order;

// 子菜单

private List<Menu> childMenus;

// ... 省去getter和setter方法以及toString方法



}



//复制代码

//递归主题方法:

//复制代码

/**

* 模块名称

*/

public Map<String,Object> testQueryMenuList() {

​ // 原始的数据

​ List

rootMenu = menuDao.queryMenuList(null);

​ // 查看结果

​ for (Menu menu : rootMenu) {

​ System.out.println(menu);

​ }

​ // 最后的结果

​ List

menuList = new ArrayList();

​ // 先找到所有的一级菜单

​ for (int i = 0; i < rootMenu.size(); i++) {

​ // 一级菜单没有parentId

​ if (StringUtils.isBlank(rootMenu.get(i).getParentId())) {

​ menuList.add(rootMenu.get(i));

​ }

​ }

​ // 为一级菜单设置子菜单,getChild是递归调用的

​ for (Menu menu : menuList) {

​ menu.setChildMenus(getChild(menu.getId(), rootMenu));

​ }

​ Map<String, Object> jsonMap = new HashMap<>();

​ jsonMap.put(“menu”, menuList);

​ //System.out.println(gson.toJson(jsonMap));//使用gson需要在pom.xml引入gson依赖见 2.1步骤

​ //return gson.toJson(jsonMap);//返回类型为String

​ return jsonMap;

}

/**

* 子方法

**/

private List

getChild(String id, List rootMenu) {

​ // 子菜单

​ List

childList = new ArrayList<>();

​ for (Menu menu : rootMenu) {

​ // 遍历所有节点,将父菜单id与传过来的id比较

​ if (StringUtils.isNotBlank(menu.getParentId())) {

​ if (menu.getParentId().equals(id)) {

​ childList.add(menu);

​ }

​ }

​ }

​ // 把子菜单的子菜单再循环一遍

​ for (Menu menu : childList) {// 没有url子菜单还有子菜单

//该节点不含子节点 具体见2.2解释

​ if (StringUtils.isBlank(menu.getUrl())) {

​ // 递归

​ menu.setChildMenus(getChild(menu.getId(), rootMenu));

​ }

​ } // 递归退出条件

​ if (childList.size() == 0) {

​ return null;

​ }

​ return childList;

}

//复制代码

//2.1.引入依赖pom.xml

com.google.code.gson

gson

2.2.8

2.2 StringUtils.isBlank(menu.getUrl())

这里根据需求可做改动,我这里如果一个菜单有子菜单的话该菜单是没有url的,子菜单才有具体的url跳转,父菜单不用绑定url点击后只展示子菜单并不进行请求接口,

所以没有url的菜单肯定是有子菜单的,有了url的菜单肯定是最终级别分支的菜单,所以对url进行判空决定是否再去查询子菜单