菜单实体类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
publicclassMenu {
// 菜单id
privateString id;
// 菜单名称
privateString name;
// 父菜单id
privateString parentId;
// 菜单url
privateString url;
// 菜单图标
privateString icon;
// 菜单顺序
privateintorder;
// 子菜单
privateList<Menu> children;
// ... 省去getter和setter方法以及toString方法
}
|
菜单一般需要排序,我们根据Menu的order字段进行排序:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/*
* 排序,根据order排序
*/
publicComparator<Menu> order(){
Comparator<Menu> comparator = newComparator<Menu>() {
@Override
publicintcompare(Menu o1, Menu o2) {
if(o1.getOrder() != o2.getOrder()){
returno1.getOrder() - o2.getOrder();
}
return0;
}
};
returncomparator;
}
|
生成树的方法:
|
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
|
publicMap<String,Object> findTree(){
Map<String,Object> data = newHashMap<String,Object>();
try{//查询所有菜单
List<Menu> allMenu = menuDao.findTree();
//根节点
List<Menu> rootMenu = newArrayList<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);
returndata;
} catch(Exception e) {
data.put("success", "false");
data.put("list", newArrayList());
returndata;
}
}
|
获取子菜单:
|
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
|
/**
* 获取子节点
* @param id 父节点id
* @param allMenu 所有菜单列表
* @return 每个根节点下,所有子菜单列表
*/
publicList<Menu> getChild(String id,List<Menu> allMenu){
//子菜单
List<Menu> childList = newArrayList<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){
returnnewArrayList<Menu>();
}
returnchildList;
}
|
最后返回的JSON串如下:
|
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
|
{
"success": "true",
"list": [
{
"id": "1",
"name": "Java",
"parentid": "0",
"order": 1,
"children": [
{
"id": "2",
"name": "并发编程",
"parentid": "1",
"order": 1,
"children": []
},
{
"id": "3",
"name": "多线程",
"parentid": "1",
"order": 2,
"children": [
"id": "4",
"name": "Thread",
"parentid": "3",
"order": 1,
"children":[]
]
}
]
},
{
"id": "5",
"name": "Python",
"parentid": "0",
"order": 2,
"children": []
}
]
}
|