easyui 生成 菜单结构树 02

来源:互联网 发布:淘宝主图尺寸750 编辑:程序博客网 时间:2024/06/16 20:58

代码地址 : 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 

0 0