這里來講一下后臺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構造樹形菜單數據就說到這里啦,希望對大家有幫助,我的分享一般都是特別詳細的,除了涉及項目隱私之外,是不會對大家有所保留的喲,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000011428318