当前位置: 移动技术网 > IT编程>开发语言>Java > java实现构造无限层级树形菜单

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

2019年07月19日  | 移动技术网IT编程  | 我要评论
这里来讲一下后台java如何构造多叉树,这样前台就可接收到数据递归构造树形菜单了。 我们来理一下如何实现构造多叉树的逻辑吧,其实整个问题概括起来就是 1、构造一个实

这里来讲一下后台java如何构造多叉树,这样前台就可接收到数据递归构造树形菜单了。

我们来理一下如何实现构造多叉树的逻辑吧,其实整个问题概括起来就是

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

2、构造菜单结构

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

具体实现:

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

package com.tcl.jr.crm.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,完整代码如下,可直接复制使用:

package com.tcl.jr.crm.util;

import java.util.arraylist;
import java.util.linkedhashmap;
import java.util.list;
import java.util.map;

import com.tcl.jr.crm.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的方法如下:

/**
   * 显示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);
      //区别于web端,这边app端list不能转为json格式,直接将list传给前台,转成json对象的话vuejs前台无法识别渲染
      returnmap.put("list", menulist);
    } catch (exception e) {
      logger.error(e.getmessage());
    }
    return jsonmapper.tojsonstring(returnmap);
  }

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

java构造树形菜单数据就说到这里啦,希望对大家有帮助,我的分享一般都是特别详细的,除了涉及项目隐私之外,是不会对大家有所保留的哟,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网