由于最近项目用到了菜单树,所以记录一下,项目用的是hibernate
菜单类定义如下:
public class Menu {
// 菜单id
private String id;
// 父菜单
private Menu parent;
// 菜单名称
private String name;
// 菜单代码
private String code;
// 菜单url
private String url;
// 备注
private String description;
// 排序
private Integer sort;
//子菜单
private List<Menu> children;
// ... 省去getter和setter方法以及toString方法
}
利用递归实现二叉树:
public List<Menu> getMenu() {
List<Menu> menus= menuService.findAllMenu(); //查询出所有的菜单
if(menus != null && menus.size() > 0) {
List<Menu> result = new ArrayList<>();
for(Menu menu : menus) {
// 判断是否是父菜单
if(menu != null && StringUtils.isBlank(menu.getParent().getId())) {
menu.setChildren(getChildrenMenu(menu.getId(), menus))
}
}
}
return menus;
}
// 获取子节点的递归方法
public List<Menu> getChildrenMenu(String id, List<Menu> menuList) {
List<Menu> lists = new ArrayList<>();
if (menuList!= null && menuList.size() > 0) {
for (Menu menu: menuList) {
if (id.equals(menu.getParentId())) {
// 递归获取子节点
menu.setChildren(getChildrenMenu(menu.getId(), menuList));
lists.add(menu);
}
}
}
return lists;
}
服务器端返回该树的所有数据。客户端通过js控制菜单的展开与折叠。