代码地址 :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
分享到:
相关推荐
2. 使用EasyUI生成菜单树: 在HTML中,我们需要一个`div`元素作为菜单树的容器,然后通过JavaScript调用`$.fn.menu`方法初始化菜单。在创建菜单时,我们可以传递一个JSON数据数组,EasyUI会根据数据自动生成菜单树...
在本文中,我们将深入探讨如何使用EasyUI框架来实现一个动态的树形菜单。EasyUI是一个基于jQuery的轻量级前端开发框架,它提供了一系列组件,包括表格、对话框、菜单等,使得开发者能够快速构建用户界面。在这个场景...
在本案例中,我们将聚焦于 "easyui 树形菜单操作",特别是在 ASP.NET 中的动态绑定。树形菜单是一种常见的用户界面元素,用于展示具有层级关系的数据,如目录结构、组织架构等。 1. **EasyUI Tree 控件** EasyUI ...
EasyUI的核心组件包括表格、表单、按钮、对话框、菜单、树形视图、面板、布局等,而科发EasyUi代码生成器能帮助开发者快速生成与这些组件交互的代码。例如,它可以自动生成用于数据展示的表格,用户操作的按钮,以及...
在这个"Jquery-easyUI动态菜单"项目中,我们将会探讨如何在标准的 Maven 项目中实现动态生成的菜单,以及其在分页和界面交互中的应用。 **1. Maven项目结构与配置** Maven是Java项目管理工具,用于构建、依赖管理和...
EasyUI 中的 Tree 组件可以展示层级结构的数据,常用于菜单、目录等场景。它支持通过 JSON 数据源或者 AJAX 异步加载数据。在“异步生成树节点”中,这意味着树节点不是一次性加载所有数据,而是根据需要在用户交互...
首先,EasyUI是一个基于jQuery的UI库,它提供了一系列预定义的组件,如表格、对话框、下拉菜单等,使得开发者可以快速构建用户界面。在描述中提到的“根据json格式获取到数据,easyui样式列表显示”,意味着我们需要...
标题中提到的“easyUI 菜单数据库获取动态菜单”是指利用easyUI来动态展示从数据库中获取的菜单结构。在实际应用中,菜单通常存储在数据库中,这样可以根据用户的权限动态生成个性化菜单,避免硬编码,提高系统的...
这个组件允许开发者创建可展开和折叠的菜单结构,非常适合用于网站的导航栏或侧边栏菜单。下面将详细介绍如何利用jQuery EasyUI 1.2创建多级折叠菜单: 1. **基本结构**: 菜单的基本HTML结构通常包括 `div` 元素...
在本项目中,我们主要探讨的是如何利用EasyUI框架创建一个具有多级菜单功能的树形结构,并且能够与后台数据库进行动态交互。EasyUI是一个基于jQuery的UI库,提供了丰富的组件,包括我们这里用到的树形控件(tree)。...
EasyUI是一个基于jQuery的UI库,提供了丰富的组件,包括表格、表单、树形菜单、对话框等,以及各种图表。在本案例中,我们将使用EasyUI的图表组件来显示从Servlet通过JSON获取的数据。 步骤如下: 1. **数据准备**...
在整合过程中,可能需要处理的问题包括菜单的定位(确保它始终显示在鼠标点击的位置),菜单项的动态生成(根据当前选中的节点或状态来决定哪些操作可用),以及事件的正确触发和处理。此外,还要注意保持整体界面的...
例如,当用户登录时,后端ashx处理程序会查询用户的角色和关联的权限,然后返回一个只包含用户有权访问的菜单的JSON对象,前端Easyui根据这个对象生成菜单栏。 6. 安全性考虑:在设计权限系统时,不仅要考虑正常...
在描述中提到,这个框架实现了多导航功能,这意味着用户可以通过多级菜单结构来访问不同的功能模块,使得复杂的应用程序界面变得有序且易于理解。EasyUI的`easyui-accordion`和`easyui-tree`组件在其中起到了关键...
本文将深入探讨如何使用JavaScript来动态生成菜单,并结合jQuery EasyUI库进行实践。 首先,了解JavaScript动态生成菜单的基本原理。通过JavaScript,我们可以操控HTML DOM(文档对象模型)来添加、删除或修改元素...
本文将详细讲解如何使用jQuery实现动态菜单列表(树)以及与layui、easyui等前端框架的整合。 jQuery是一款轻量级、高性能的JavaScript库,它简化了DOM操作、事件处理和动画效果,使得开发者可以更加便捷地实现复杂...
根据用户的角色,动态生成菜单是权限管理的关键。EasyUI的菜单组件支持JSON数据源,开发者可以根据用户的角色权限动态生成JSON数据,从而控制菜单的显示。这样,用户只能看到他们有权访问的功能模块。 4. 权限校验 ...
- EasyUI 提供了诸如对话框(dialog)、表格(datagrid)、下拉菜单(combobox)、树形控件(tree)等众多组件,这些组件大大简化了前端开发工作。 2. **Java 后端与 EasyUI 前端的交互**: - JSON 数据格式:...
在SpringMVC中,可以通过Controller从Service获取当前用户的角色和对应的菜单权限,然后将数据传递给EasyUI的菜单组件来生成菜单。 【数据列表动态显示】 数据列表动态显示是指根据用户查询条件,从数据库中获取...
而EasyUI则是对jQuery的进一步扩展,提供了一系列预定义的UI组件,如数据网格、对话框、菜单、表单、树形结构等,使得开发者无需从零开始编写复杂的HTML、CSS和JavaScript代码,就能快速构建出符合现代标准的Web界面...