java实现构造无限层级树形菜单

1、构造一个实体类,用来存储节点,所以我们构造的需要四个对象(id,pid,name,和chirenList)

2、构造菜单结构

3、构造子菜单,如此循环,通过pid判断上级菜单

具体实现:

1、这里构造Tree.java实体类

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

39

40

41

package com.test.entity;

 

/**

 * 类名称:Tree

 * 类描述:树形结构

 */

public class Tree {

 

  private String id;

  private String pId;

  private String name;

  public String getId() {

    return id;

  }

 

  public void setId(String id) {

    this.id = id;

  }

 

  public String getpId() {

    return pId;

  }

 

  public void setpId(String pId) {

    this.pId = pId;

  }

 

  public String getName() {

    return name;

  }

 

  public void setName(String name) {

    this.name = name;

  }

 

  @Override

  public String toString() {

    return "Tree [id=" + id + ", pId=" + pId + ", name=" + name + "]";

  }

 

}

2、封装树形结构类,这里我封装成一个通用的工具类,方便项目中使用,MenuTreeUtil.java,完整代码如下,可直接复制使用:

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

39

40

41

42

43

44

45

46

47

48

49

50

package com.test.util;

 

import java.util.ArrayList;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

 

import com.test.entity.Tree;

 

/**

 * 类名称:MenuTreeUtil

 * 类描述:递归构造树型结构

 */

public class MenuTreeUtil {

   

  public static Map<String,Object> mapArray = new LinkedHashMap<String, Object>();

  public List<Tree> menuCommon;

  public List<Object> list = new ArrayList<Object>();

    

  public List<Object> menuList(List<Tree> menu){  

    this.menuCommon = menu;

    for (Tree x : menu) {  

      Map<String,Object> mapArr = new LinkedHashMap<String, Object>();

      if(x.getpId()=="0"){

        mapArr.put("id", x.getId());

        mapArr.put("name", x.getName()); 

        mapArr.put("pid", x.getpId()); 

        mapArr.put("childList", menuChild(x.getId())); 

        list.add(mapArr);

      }

    }  

    return list;

  }

   

  public List<?> menuChild(String id){

    List<Object> lists = new ArrayList<Object>();

    for(Tree a:menuCommon){

      Map<String,Object> childArray = new LinkedHashMap<String, Object>();

      if(a.getpId() == id){

        childArray.put("id", a.getId());

        childArray.put("name", a.getName());

        childArray.put("pid", a.getpId());

        childArray.put("childList", menuChild(a.getId()));

        lists.add(childArray);

      }

    }

    return lists;

  }

 

}

3、最后在控制台请求方法调用数据就行了,在controller的方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

  /**

   * 显示APP树形结构

   */

  @RequestMapping(value = { "getAPPTree" }, produces = "text/html;charset=UTF-8")

  @ResponseBody

  public String getAPPTree(HttpServletRequest request, HttpServletResponse response) throws Exception {

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

    MenuTreeUtil menuTree = new MenuTreeUtil();

    PageData pd = this.getPageData();

    try {

      List<Tree> list = dataDicService.buildTree(pd.getString("instType"));

      List<Object> menuList = menuTree.menuList(list);

      returnmap.put("list", menuList);

    } catch (Exception e) {

      logger.error(e.getMessage());

    }

    return JsonMapper.toJsonString(returnmap);

  }

4、然后前台ajax调用第三部的接口方法就而已请求到所需的数据,如何渲染成好的前台页面,参照我另一篇文章:vuejs使用递归组件实现树形目录

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITdada

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值