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