后台根据数据库中的菜单表返回链表形式的多层结构,也就是菜单树,可以使用递归形式和嵌套for循环形式。本文只是模拟展示其思路。
数据库
?简单形式的菜单表,整个菜单树有三层,0层1有两个子菜单 1层2 和 1层4,而1层2又有两个子菜单2层1和2层2。show_order可以控制同一菜单下的子菜单的顺序。
public class Menu {
private Long id;
private String name;
private String url;
private Long pId;
private Long showOrder;
private List<Menu> childList = new ArrayList<Menu>();
@Override
public String toString() {
return "Menu{" +
"id=" + id +
", name='" + name + '\'' +
", url='" + url + '\'' +
", pId=" + pId +
", showOrder=" + showOrder +
", childList=" + childList +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Long getpId() {
return pId;
}
public void setpId(Long pId) {
this.pId = pId;
}
public Long getShowOrder() {
return showOrder;
}
public void setShowOrder(Long showOrder) {
this.showOrder = showOrder;
}
public List<Menu> getChildList() {
return childList;
}
public void setChildList(List<Menu> childList) {
this.childList = childList;
}
}
以上代码是菜单表的实体类。
具体实现方法如下,分为两种:
1.递归形式:解释在代码中
public List<Menu> menuShow(){
Menu menu = new Menu();
//同数据库保持一致,一般将首层菜单的父菜单id设为0;
menu.setId(0);
getChilds(menu);
return menu.getChildList();
}
public void getChilds(Menu parent){
//这里通过service层和mapper层实现,传参当前id,也就是sql查询结果是p_id为当前id的数据,并且按show_order升序写入数组。
List<Menu> childList = menuService.selectChildList(parent.getId());
for(Menu child:=childList ){
//递归本方法,找子菜单的子菜单。
getChilds(child);
}
//将子菜单数组写入。
parent.setChildList(childList);
//不需要写递归跳出判断,childList 为空时就会跳出。
}
2.嵌套for循环形式:
嵌套一层for循环是了找出那些非0层菜单的父菜单并建立联系。
public List<Menu> menuShow(){
List<Menu> childList = new ArrayList<Menu>();
//直接查询菜单表中的所有数据并按show_order升序存入链表
List<Menu> originList = menuService.selectList();
//遍历初始链表找每一个菜单的父菜单
for(Menu menu : originList ){
Menu temp = menu;
//0层菜单直接加入结果数组
if(menu.getId() == 0){
childList.add(menu);
}else{
//非0层通过遍历原始数组找到其父菜单,并将其加入其父菜单的子菜单数组,完成break,不 做无意义之事。
for(Menu origin: originList){
if(temp.getpId().equals(origin.getId())){
origin.getChildList().add(temp);
break;
}
}
}
}
return childList;
}
|