网上大部分菜单树,都是单独用js代码来实现的,这样做的缺点是:用户无法动态的设置菜单项,比如,超级管理员可能需要根据每个用户的权限,赋予他们不同的系统功能,不同的功能对应着不同数量的菜单项。
对于此问题,本人在他人一个js菜单的基础上,开发了一个动态的系统菜单结构树:利用java代码创建树对象,并可以无限级别地给他添加子节点,然后在页面上生成js代码来显示树菜单。
在这儿写一个简单的Demo ,此例子共包含个文件,如下:
1、Node.java  节点类。
2、TreeBoot.java 树的根类。
3、treeBean.java 页面中引入的javaBean,在此文件中实现菜单树的构建。
3、test.jsp   测试页面。
下面提供各个文件的代码:
Node.java

package com.syw.tree;
import java.util.ArrayList;
import java.util.List; public class Node{
//此节点下的子节点list,可以无限制 地向下扩展子节点
private List<Node> list;
//节点连接地址
private String url;
//要显示的文字
private String showName;
//指定要显示的Iframe
private String target;
//name属性
private String name;
//如果为checkBox,selected = true or false
private boolean isSelected;
//如果为checkBox,value属性值
private String value;
//节点图标,如果不给其赋值,有默认图标
private String img;
//用于标识是checkBox(input = 1), 还是 link(input = 0)
private int input = 0; //link构造方法
public Node(String url,String showName,String target,String img){
list = new ArrayList();
this.url = url;
this.showName = showName;
this.target = target;
this.input = 0;
this.img = img;
} //checkBox构造方法
public Node(String showName,String name,boolean isSelected,String value,String img){
list = new ArrayList();
this.showName = showName;
this.name = name;
this.isSelected = isSelected;
this.value = value;
this.input = 1;
this.img = img;
} //为树添加节点
public void add(Node node){
this.list.add(node);
} //以下为所有属性的set、get方法
public List getList() {
return list;
} public void setList(List list) {
this.list = list;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public String getTarget() {
return target;
} public void setTarget(String target) {
this.target = target;
} public String getShowName() {
return showName;
} public void setShowName(String showName) {
this.showName = showName;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public boolean isSelected() {
return isSelected;
} public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public int getInput() {
return input;
} public void setInput(int input) {
this.input = input;
} public String getImg() {
return img;
} public void setImg(String img) {
this.img = img;
} }

treeBoot.java

package com.syw.tree;
import java.util.ArrayList;
import java.util.List; public class TreeRoot { //树的标题
private String title; //树根节点的图标
private String titleImgPath; //合并成的js语句内容
private String treeContent; //树的所有子节点
private List<Node> list; //节点计数器
private int nodeId = 0; public TreeRoot(String title){
list = new ArrayList();
this.title = title;
} public void add(Node node){
this.list.add(node);
} public void setTitle(String title) {
this.title = title;
} public void setTitleImgPath(String titleImgPath) {
this.titleImgPath = titleImgPath;
} public void setList(List<Node> list) {
this.list = list;
}
//用递归函数取得所有树节点,并组合成js语句
private void readList(List<Node> list,int parentId){
for(Node node:list){
this.nodeId++;
if(node.getInput() == 0){
this.treeContent += "d.add("+this.nodeId+","+parentId+",'"+node.getShowName()+"','"+node.getUrl()+"','','"+node.getTarget()+"','');";
}else{
this.treeContent += "d.add("+this.nodeId+","+parentId+",'"+node.getShowName()+"<input name=\""+node.getName()+"\" type=\"checkbox\" "+(node.isSelected()?"checked=\"checked\" ":"")+"\" value=\""+node.getValue()+"\" >','','','','');";
}
if(node.getList().size()>0){
readList(node.getList(),this.nodeId);
}
}
} //创建树,并返回js代码
public String buildTree() {
this.treeContent = "d.add(0,-1,'"+title+"');";
readList(list,0);
return this.treeContent;
} }

treeBean.java

package com.syw.tree;
import java.util.ArrayList;
import java.util.List; public class treeBean { /**
* @param args
*/
public static String tree() { Node log = new Node("","我的A Link测试","","");
log.add(new Node("http://www.baidu.com","删除日志","iframe",""));
log.add(new Node("http://www.baidu.com","添加日志","iframe",""));
log.add(new Node("http://www.baidu.com","修改日志","iframe","")); Node checkbox = new Node("","我的checkBox测试","",""); checkbox.add(new Node("信息1","ss",false,"value1",""));
checkbox.add(new Node("信息3","ss",false,"value3",""));
checkbox.add(new Node("信息2","ss",false,"value2",""));
checkbox.add(new Node("信息4","ss",false,"value4","")); TreeRoot blogTree = new TreeRoot("blog管理");
blogTree.add(log);
blogTree.add(checkbox); return blogTree.buildTree(); } }

test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="com.syw.tree.treeBean"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="StyleSheet" href="dtree.css" type="text/css" />
<script type="text/javascript" src="dtree.js"></script>
</head>
<body>
<div style="display:none" id="tree"><%=treeBean.tree()%></div>
<script type="text/javascript">
<!--
d = new dTree('d');
//从treeBean中获取js代码
var treecontent = document.getElementById("tree").innerHTML;
//执行代码
eval(treecontent);
document.write(d);
//-->
</script>
</div>
</body>
</html>

运行结果:

(收藏)

java实现的可以无限级别添加子节点的菜单树的更多相关文章

  1. winform treeview 通过节点名称添加子节点

    /// <summary> /// 添加人员节点(利用TreeNodeCollection) /// </summary> /// <param name="t ...

  2. js操作DOM在父元素中的结尾添加子节点注意

    impressionHtml=`<img src=${value} alt=""/>`; document.getElementById("wrapper&q ...

  3. extjs4 树列表 添加子节点 刷新所有父节点数据

    itemclick:function(view, record, item,index){console.log(record.parentNode) for(pNode = record.paren ...

  4. Ext.jsTree 向子节点添加叶子节点

    // 定义搜索节点树结构Store const nodeStore = Ext.create('Ext.data.TreeStore', { autoLoad : true, id : 'nodeSt ...

  5. Java生成菜单树(目录树)的几种方式

    本文介绍两种不同生成多级目录树的方式:1. 递归生成,2.  map+list 集合生成.最下方会附上完整代码. 生成树的基本规则:子节点的par_id等于父节点的id. 1. 实体类 import ...

  6. C#操作XML学习之创建XML文件的同时新建根节点和子节点(多级子节点)

    最近工作中遇到一个问题,要求创建一个XML文件,在创建的时候要初始化该XML文档,同时该文档打开后是XML形式,但是后缀名不是.在网上找了好些资料没找到,只能自己试着弄了一下,没想到成功了,把它记下来 ...

  7. js遍历 子节点 子元素

    Js 节点 子元素 属性 方法 // 添加子节点前 删除所有子节点 var usernameEle = document.getElementById("username"); v ...

  8. DOM操作插入新的子节点

    appendChid.insertBefore首先这两个方法都是添加子节点. append(追加),appendChid:给父节点的子节点末尾添加子节点. insertBefore(newNode, ...

  9. c# winform结合数据库动态生成treeview的父节点和子节点方法和思路

    tb_food表的结构如图一: tb_foodtype表的结构如图二: //获取tb_foodtype表中的所有数据 private void InitDataTable() { SqlConnect ...

随机推荐

  1. [LeetCode] Burst Balloons (Medium)

    Burst Balloons (Medium) 这题没有做出来. 自己的思路停留在暴力的解法, 时间复杂度很高: 初始化maxCount = 0. 对于当前长度为k的数组nums, 从0到k - 1逐 ...

  2. java学习多线程之生产者消费者

    在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系.那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三.李四负责生产烤鸭,王五.马六负责吃烤鸭,那么前者生产完烤 ...

  3. 我泡在GitHub上的177天 by Ryan Seys

    我泡在GitHub上的177天   这是一个关于我如何连续177天(将近半年)泡在GitHub上不间断地贡献代码的故事.我会谈到我为什么要这么做,以及为什么你也应该效仿,或者至少做点类似的事情.这是一 ...

  4. GCC常用参数

    GCC--GNU C Compiler c语言编译器(远不止c语言) 介绍: 作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个C ...

  5. IIS服务器设置造成引用第三方权限不足问题

    使用IIS部署站点,报以下错误: Exception Details: System.Security.SecurityException: That assembly does not allow ...

  6. "The Same Game": A Simple Game from Start to Finish

    文档视图结构 文档/视图体系结构是一个神奇的架构,通过这个架构,我们可以分离应用程序的数据和显示.文档包含了全部的数据,视图从文档获取数据并且显示给用户.针对这个游戏例子,我们得数据是游戏板和有颜色的 ...

  7. margin-top 父div下落

    解决方法: 1.修改父元素的高度,增加padding-top样式模拟(padding-top:1px:常用) 2.为父元素添加overflow:hidden:样式即可(完美) 3.为父元素或者子元素声 ...

  8. Linux系统下如何修改主机名

    vi /etc/sysconfig/network vi /etc/hosts sudo hostname

  9. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8

    第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器 ...

  10. Bzoj 3505: [Cqoi2014]数三角形 数论

    3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Description