代码地址 :https://github.com/Wenhaoran/webgate
上两篇博客,介绍了,为啥js 拼接html ,为啥不能生成正确的菜单树。 也写了 通过js 来 拼接的方法。
下面说一下,正确的生成 菜单树 的方法。
先说页面,页面配置很简单。
就是在 jsp 中,嵌套一点 java 代码 + 引入一个java 文件 + <%= %> 的用法,如图下:
上图中,被注释掉的代码 ,是 通过js 生成的html,完全复制过来后,页面是正确的。
完整的 WebMenuList 文件代码:
WebMenuList 的代码有点多,慢慢的看,主要是,循环判断的逻辑有点绕。
大概意思是这样的:
1、生成html 的准备工作。
先循环全部 资源,判断当前资源,是否有 父ID。
否: 如果没有,保存 当前资源 到 list 中。 这个 list 中的资源,就是 根节点。
是: 如果 有,就把当前节点,保存到,父ID 的 资源 的 child 集合中。
说白了就这么简单。
2、准备生成 html
循环 根节点 集合,判断 当前节点 是否有 子节点
是: 循环当前节点的子节点集合 ,拼接html ,再 判断 子节点 是否还存在子节点,如果存在就不断的重复 循环, 再拼接html
否: 拼接html 。
package cn.service.menu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import cn.authcation.bean.MenuHtmlList;
import cn.authcation.bean.MenuResourceList;
import cn.po.system.SysResource;
public class WebMenuList {
public String getMenuList(HttpServletRequest request) {
String ticket = (String) request.getSession().getAttribute("ticket");
if(!"".equals(ticket)&&ticket!=null){
List<SysResource> resourceList = MenuResourceList.get(ticket);
if("".equals(MenuHtmlList.get(ticket))||MenuHtmlList.get(ticket) == null){
String html = createMenuHtml(resourceList,ticket);
MenuHtmlList.put(ticket, html);
return html;
}else{
return MenuHtmlList.get(ticket);
}
}
return "";
}
public String createMenuHtml(List<SysResource> resourceList,String ticket){
StringBuffer sb = new StringBuffer();
Map<String, SysResource> menuList = new HashMap<String, SysResource>();
Map<String, SysResource> resourceData = new HashMap<String, SysResource>();
if (resourceList != null) {
for (int i = 0; i < resourceList.size(); i++) {
SysResource resource = resourceList.get(i);
menuList.put(resource.getId(), resource);
}
}
if (resourceList != null) {
for (int i = 0; i < resourceList.size(); i++) {
SysResource resource = resourceList.get(i);
//判断,是否属于根节点
if (resource.getParentResourceId() == null || resource.getParentResourceId() == "") {
//属于根节点
//根节点集合,存值
resourceData.put(resource.getId(), resource);
}else{
//不是根节点
// SysResource parentResource = resourceData.get(resource.getParentResourceId());
//判断当前 路径 的 父节点,是不是根节点。
// if (parentResource != null) {
// if(parentResource.getChild() == null){
// List<SysResource> list = new ArrayList<SysResource>();
// parentResource.setChild(list);
// }
// parentResource.getChild().add(resource);
//
// }else{
SysResource parentResource2 = menuList.get(resource.getParentResourceId());
if(parentResource2.getChild() == null){
List<SysResource> list = new ArrayList<SysResource>();
parentResource2.setChild(list);
}
parentResource2.getChild().add(resource);
// }
}
}
}
resourceData.get("");
if(resourceData.size() > 0){
sb = createMenuListParent(resourceData,sb,ticket);
}else{
sb.append("<li iconCls=\"\">");
sb.append("<span>无权限</span> ");
sb.append("<ul>");
sb.append("");
sb.append("</ul>");
sb.append("</li>");
}
return sb.toString();
}
public StringBuffer createMenuListParent(Map<String, SysResource> resourceData,StringBuffer sb,String ticket){
for (Map.Entry<String, SysResource> entry : resourceData.entrySet()) {
List<SysResource> list = entry.getValue().getChild();
if(list!=null && entry.getValue().getChild().size()>0){
sb.append("");
sb.append("<li>");
sb.append("<span>" + entry.getValue().getName() + "</span>");
sb.append("<ul>");
List<SysResource> childrenList = entry.getValue().getChild();
for(SysResource rs: childrenList){
createMenuListChild(rs,sb,ticket);
}
sb.append("");
sb.append("</ul>");
sb.append("</li>");
}else{
sb.append("<li>");
String url = assemblyUrl(entry.getValue().getLink(), ticket);
sb.append("");
sb.append("<a href='###' onclick='openContent(\""+ entry.getValue().getName() +"\", \""+ url +"\")'>");
sb.append("<span style='cursor:pointer;'>" + entry.getValue().getName() + "</span>");
sb.append("</a>");
sb.append("");
sb.append("");
sb.append("</li>");
}
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
return sb;
}
public StringBuffer createMenuListChild(SysResource resourceData,StringBuffer sb,String ticket){
if(resourceData.getChild() !=null && resourceData.getChild().size() > 0){
sb.append("");
sb.append("<li>");
sb.append("<span>" + resourceData.getName() + "</span>");
sb.append("<ul>");
for(SysResource child: resourceData.getChild()){
createMenuListChild(child,sb,ticket);
}
sb.append("");
sb.append("</ul>");
sb.append("</li>");
}else{
sb.append("");
sb.append("<li>");
String url = assemblyUrl(resourceData.getLink(), ticket);
sb.append("");
sb.append("<a href='###' onclick='openContent(\""+ resourceData.getName() +"\", \""+ url +"\")'>");
sb.append("<span style='cursor:pointer;'>" + resourceData.getName() + "</span>");
sb.append("</a>");
sb.append("");
sb.append("");
sb.append("</li>");
}
return sb;
}
public String assemblyUrl(String url,String ticket){
// if (resource.link == null || resource.link == "") {
// return null;
// }
// var url = [];
// if (resource.full == 1) { // 是否全路径 1-否 2-是
// url.push("http://");
// url.push(resource.component.address);
// url.push(":");
// url.push(resource.component.port);
// url.push("/");
// url.push(resource.component.code);
// }
// url.push(resource.link);
// url.push("?ticket=" + ticket);
// url.push("&pt_rtype=m");
//
// return url.join("");
return url;
}
}
代码中,通过session 获取的ticket ,是用来获取 用户信息。 在用户登录系统之后,会生成 随机数(ticket), 放到 session 和 用户信息存储文件中 ,来保存用户信息。
MenuResourceList 和MenuHtmlList ,是用来 存储 menu 信息的类。
分别如图下:MenuHtmlList 的 key 是 ticket ,value ,是 拼接生成的html 。
MenuResourceList 的key ,是 当前用户 随机生成 的ticket 。
而 value ,就是 菜单树 数据的集合。
数据的来源,是在 登录系统时,查询并保存的。
保存数据的过程,如图下:
通过这样,就可以成功的,先 拼接 当前 角色对应的html 到页面上,然后让他正常的显示了。
OK。
如果有啥疑问,欢迎随时找我问。联系方式 QQ:1286238812 备注,csdn easyui tree