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
- easyui 生成 菜单结构树 02
- easyUI动态生成多级菜单树
- easyui 生成 多级 菜单树 01
- easyui树形结构读取菜单
- EasyUI 树菜单
- jquery easyui Accordion 动态生成菜单
- easyui扁平Json生成树形菜单
- easyui-accordion动态生成菜单的实现
- 绑定生成一个有树结构的下拉菜单
- 绑定生成一个有树结构的下拉菜单
- JQuery EasyUI 树形结构同步生成代码。
- EasyUI树目录结构
- easyui 生成树
- easyUI生成树
- EasyUI菜单
- SSH 使用EasyUI实现ZTee树状结构菜单
- 通过JS控制EasyUI-Layout的布局,并生成菜单
- easyui前台树结构展示
- React从入门到精通系列之(14)refs和DOM元素
- HDU
- leetcode 100. Same Tree
- docker系列一,认识初步
- <table>表格标签
- easyui 生成 菜单结构树 02
- 【BZOJ3996】【TJOI2015】线性代数(最小割)
- 2的次幂表示
- 决策树
- 第二十一、Java之main方法详解
- 287. Find the Duplicate Number
- JavaScript —— 数组的函数用法演示
- 欢迎使用CSDN-markdown编辑器
- Spring 事务原理