网上大部分菜单树,都是单独用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. [cocos2d] 显示状态与文字

    前言: 对于显示数值与文字一般有三种方式可以使用: CCLabelTTF .CCLabelBMFont .CCLabelAtlas 详细区别可参考:cocos2d 中添加显示文字的三种方式(CCLab ...

  2. 队列的实现(JAVA)

    定义    队列(queue)是一种特殊的线性表,它只允许在表的前端进行删除,在表的后端进行插入. 进行插入端的称为队尾,进行删除端的称为队头.队列是先进先出原则的.队列的实现同样可以 使用两种方式来 ...

  3. git从指定的commit创建分支

    How do I create a new git branch from an old commit? git checkout -b justin a9c146a09505837ec03b Thi ...

  4. C# Read/Write another Process' Memory ZZ

    Today's tutorial is about...processes' memory! In this article I'll show you how to read/write a pro ...

  5. T-SQL查询进阶--详解公用表表达式(CTE)

    简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的. 但是,视图是作为系统对象存在数据库中,那对于结果 ...

  6. SQL Server数据库修改字段属性

      1:向表中添加字段 Alter table [表名] add [列名] 类型 2: 删除字段 Alter table [表名] drop column [列名] 3: 修改表中字段类型 (可以修改 ...

  7. leetcode reverse integer&&Palindrome Number

    public class Solution { public int reverse(int x) { int ret=0; while(x!=0) { int t=x%10; ret=ret*10+ ...

  8. JavaScript高级程序设计49.pdf

    HTML5事件 contextmenu事件 contextmenu事件是冒泡的,可以将事件处理程序指定到document,这个事件的目标是用户操作的元素,在兼容DOM的浏览器中使用event.prev ...

  9. hdoj 1068 Girls and Boys【匈牙利算法+最大独立集】

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. 我的ubuntu配置

    每次装系统都是非常蛋疼的过程,新装的系统还是要配置一下的 首先安装google拼音 sudo apt-get install fcitx fcitx-googlepinyin 然后按装numix主题 ...