java 遞歸實現構造無限層級樹形菜單


這里來講一下后台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.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,完整代碼如下,可直接復制使用:

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.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的方法如下:

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);
       //區別於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構造樹形菜單數據就說到這里啦,希望對大家有幫助,我的分享一般都是特別詳細的,除了涉及項目隱私之外,是不會對大家有所保留的喲,也希望大家多多支持腳本之家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM