Java构建树形菜单的实例代码(支持多级菜单)

 更新时间:2017年09月04日 10:50:16   作者:随便。  
这篇文章主要介绍了Java构建树形菜单的实例代码(支持多级菜单),非常不错,具有参考借鉴价值,需要的朋友可以参考下

效果图:支持多级菜单。

菜单实体类:

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> children;
  // ... 省去getter和setter方法以及toString方法
}

菜单一般需要排序,我们根据Menu的order字段进行排序:

 /*
   * 排序,根据order排序
   */
  public Comparator<Menu> order(){
    Comparator<Menu> comparator = new Comparator<Menu>() {
      @Override
      public int compare(Menu o1, Menu o2) {
        if(o1.getOrder() != o2.getOrder()){
          return o1.getOrder() - o2.getOrder();
        }
        return 0;
      }
    };
    return comparator;
  }

生成树的方法:

public Map<String,Object> findTree(){
  Map<String,Object> data = new HashMap<String,Object>();
    try {//查询所有菜单
      List<Menu> allMenu = menuDao.findTree();
      //根节点
      List<Menu> rootMenu = new ArrayList<Menu>();
      for (Menu nav : allMenu) {
        if(nav.getParentId().equals("0")){//父节点是0的,为根节点。
          rootMenu.add(nav);
        }
      }
      /* 根据Menu类的order排序 */
      Collections.sort(rootMenu, order());
      //为根菜单设置子菜单,getClild是递归调用的
      for (Menu nav : rootMenu) {
        /* 获取根节点下的所有子节点 使用getChild方法*/
        List<Menu> childList = getChild(nav.getId(), allMenu);
        nav.setChildren(childList);//给根节点设置子节点
      }
      /**
       * 输出构建好的菜单数据。
       * 
       */
      data.put("success", "true");
      data.put("list", rootMenu);
      return data;
    } catch (Exception e) {
      data.put("success", "false");
      data.put("list", new ArrayList());
      return data;
    }
  }

获取子菜单:

/**
   * 获取子节点
   * @param id 父节点id
   * @param allMenu 所有菜单列表
   * @return 每个根节点下,所有子菜单列表
   */
  public List<Menu> getChild(String id,List<Menu> allMenu){
    //子菜单
    List<Menu> childList = new ArrayList<Menu>();
    for (Menu nav : allMenu) {
      // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
      //相等说明:为该根节点的子节点。
      if(nav.ParentId().equals(id)){
        childList.add(nav);
      }
    }
    //递归
    for (Menu nav : childList) {
      nav.setChildren(getChild(nav.getId(), allMenu));
    }
    Collections.sort(childList,order());//排序
    //如果节点下没有子节点,返回一个空List(递归退出)
    if(childList.size() == 0){
      return new ArrayList<Menu>();
    }
    return childList;
  }

最后返回的JSON串如下:

{
 "success": "true",
 "list": [
   {
    "id": "1",
    "name": "Java",
    "parentid": "0",
    "url": "http://www.aliouchen.com",
    "order": 1,
    "children": [
     {
       "id": "2",
       "name": "并发编程",
       "parentid": "1",
       "url": "http://www.aliouchen.com",
       "order": 1,
       "children": []
     },
     {
       "id": "3",
       "name": "多线程",
       "parentid": "1",
       "url": "http://www.aliouchen.com",
       "order": 2,
       "children": [
         "id": "4",
         "name": "Thread",
         "parentid": "3",
         "url": "http://www.aliouchen.com",
         "order": 1,
          "children":[]
       ]
     }
    ]
   },
   {
    "id": "5",
    "name": "Python",
    "parentid": "0",
    "url": "http://www.aliouchen.com",
    "order": 2,
    "children": []
   }
  ]
}

总结

以上所述是小编给大家介绍的Java构建树形菜单的实例代码(支持多级菜单),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • SpringMVC常用注解载入与处理方式详解

    SpringMVC常用注解载入与处理方式详解

    这篇文章主要介绍了SpringMVC常用注解载入的方式和处理的方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java 利用枚举实现接口进行统一管理

    Java 利用枚举实现接口进行统一管理

    这篇文章主要介绍了Java 利用枚举实现接口进行统一管理,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot中MyBatis-Plus 查询时排除某些字段的操作方法

    SpringBoot中MyBatis-Plus 查询时排除某些字段的操作方法

    这篇文章主要介绍了SpringBoot中MyBatis-Plus 查询时排除某些字段的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java中ArrayList集合的常用方法大全

    Java中ArrayList集合的常用方法大全

    这篇文章主要给大家介绍了关于Java中ArrayList集合的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Springboot教程之如何设置springboot热重启

    Springboot教程之如何设置springboot热重启

    这篇文章主要介绍了Springboot教程之如何设置springboot热重启,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • SpringCloud修改Feign日志记录级别过程浅析

    SpringCloud修改Feign日志记录级别过程浅析

    OpenFeign源于Netflix的Feign,是http通信的客户端。屏蔽了网络通信的细节,直接面向接口的方式开发,让开发者感知不到网络通信细节。所有远程调用,都像调用本地方法一样完成
    2023-02-02
  • Java线程安全中的原子性浅析

    Java线程安全中的原子性浅析

    这篇文章主要介绍了Java线程安全中的原子性,原子性是指一条线程在执行一系列程序指令操作时,该线程不可中断。一旦出现中断,那么就可能会导致程序执行前后的结果不一致
    2023-02-02
  • java题解LeetCode454.四数相加示例

    java题解LeetCode454.四数相加示例

    这篇文章主要为大家介绍了java题解LeetCode454.四数相加示例思路解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • java泛型的局限探究及知识点总结

    java泛型的局限探究及知识点总结

    在本篇内容里小编给大家分享的是一篇关于java泛型的局限探究及知识点总结内容,有需要的朋友们可以跟着学习参考下。
    2021-07-07
  • Java设计模式之建造者模式实例详解

    Java设计模式之建造者模式实例详解

    这篇文章主要介绍了Java设计模式之建造者模式,结合具体实例形式分析了建造者模式的概念、原理、实现方法与相关使用注意事项,需要的朋友可以参考下
    2017-09-09

最新评论