java实现的可以无限级别添加子节点的菜单树
网上大部分菜单树,都是单独用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实现的可以无限级别添加子节点的菜单树的更多相关文章
- winform treeview 通过节点名称添加子节点
/// <summary> /// 添加人员节点(利用TreeNodeCollection) /// </summary> /// <param name="t ...
- js操作DOM在父元素中的结尾添加子节点注意
impressionHtml=`<img src=${value} alt=""/>`; document.getElementById("wrapper&q ...
- extjs4 树列表 添加子节点 刷新所有父节点数据
itemclick:function(view, record, item,index){console.log(record.parentNode) for(pNode = record.paren ...
- Ext.jsTree 向子节点添加叶子节点
// 定义搜索节点树结构Store const nodeStore = Ext.create('Ext.data.TreeStore', { autoLoad : true, id : 'nodeSt ...
- Java生成菜单树(目录树)的几种方式
本文介绍两种不同生成多级目录树的方式:1. 递归生成,2. map+list 集合生成.最下方会附上完整代码. 生成树的基本规则:子节点的par_id等于父节点的id. 1. 实体类 import ...
- C#操作XML学习之创建XML文件的同时新建根节点和子节点(多级子节点)
最近工作中遇到一个问题,要求创建一个XML文件,在创建的时候要初始化该XML文档,同时该文档打开后是XML形式,但是后缀名不是.在网上找了好些资料没找到,只能自己试着弄了一下,没想到成功了,把它记下来 ...
- js遍历 子节点 子元素
Js 节点 子元素 属性 方法 // 添加子节点前 删除所有子节点 var usernameEle = document.getElementById("username"); v ...
- DOM操作插入新的子节点
appendChid.insertBefore首先这两个方法都是添加子节点. append(追加),appendChid:给父节点的子节点末尾添加子节点. insertBefore(newNode, ...
- c# winform结合数据库动态生成treeview的父节点和子节点方法和思路
tb_food表的结构如图一: tb_foodtype表的结构如图二: //获取tb_foodtype表中的所有数据 private void InitDataTable() { SqlConnect ...
随机推荐
- 虚拟机安装了ubuntu,忘记密码修复
在虚拟机中按照以下步骤重新为用户设定新密码. 重启Ubuntu,随即长按shift进入grub菜单: 选择recovery mode,回车确认: 在Recovery Menu中,选择“Root Dro ...
- Migrating from IntelliJ Projects
We might provide an automatic migration option in Android Studio in the future. For now, to migrat ...
- ppi和dpi
以下内容都是我自己总结的,如有不妥之处,请留言讨论,批评指正.万分感谢!ppi:可以用下面公式求得 对于手机屏幕来说,屏幕尺寸是固定的,分辨率一般是不可以调节的.所以ppi是一个定值.此值越高显示越细 ...
- C++实现RTMP协议发送H.264编码及AAC编码的音视频(转)
C++实现RTMP协议发送H.264编码及AAC编码的音视频(转) RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia ...
- Unity3D之多个fbx导入场景, 合并多个动画
1:先导入到合适的文件夹, Unity自动刷新, 生成相应的文件. 2:在Project视图中选中单个fbx, 在Inspector中选择"Rig", 更改"Animat ...
- DevExpress gridControl控件动态绑定列 zt
DataTable dt = =Query.GetCustome=(ref customColumnCount); //绑定列 gridView.Columns.Add(}); gridView.Co ...
- OpenJDK 8 on Windows
OpenJDK官网提供了非Windows已编译版本的下载. JDK 8的Windows安装版本目前网上提供有两种版本: 1.RED HAT发布的OpenJDK 8 Windows版 2.ojdkbui ...
- 微软原版SQLHelper类
代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...
- 2D游戏编程1--windows编程模型
一.创建一个windows程序步骤 1.创建一个windows类 2.创建一个事件处理程序 3.注册windows类 4.用之前创建的windows类创建一个窗口 5.创建一个主事件循环 二.存储 ...
- HOST1PLUS 的 VPS 主機-絕佳的性能和特惠的價格
HOST1PLUS 的 VPS 主機-絕佳的性能和特惠的價格 undefined Open Container Project undefined 80后美女董事长吴艳:嫁得好不一定比干得好容易 - ...