dTree 动态生成树
http://luohua.iteye.com/blog/451453
dTree 主页:http://destroydrop.com/javascripts/tree/
dTree是个很方便在页面生成树的 js 控件,如果你下载了,我猜里在几分钟之内便能在页面上显示出一颗树来。
它本身给的例子是通过一些静态数据构造树,下面我说一种通过查询的数据动态构造树的方法。
例子里没有真实的数据库操作,而是用一个模拟的数据库操作类替代。
在该例子中为了简便和理解没有分为过多的层,仅有 页面显示层 和 模拟的 数据库层。
最后对页面上有逻辑代码的问题作了下改进。
首先看看model 类,如下:
- public class Node {
- private int id;
- private String name;
- private int pId;
- public Node(){}
- public Node(int id, String name, int pId){
- this.id = id;
- this.name = name;
- this.pId = pId;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getPId() {
- return pId;
- }
- public void setPId(int id) {
- pId = id;
- }
- }
model 类很简单,并且只包含了构造一个树必要的几个属性,结点id,结点名字和结点父id。
下面再来看下上面 model 的 数据库操作类,里面构造了一些数据,并有一些得到数据的方法,如下:
- public class NodeDb {
- private static List<Node> treeList;
- static{
- treeList = new ArrayList<Node>();
- Node n = new Node(0,"Book",-1);
- treeList.add(n);
- n = new Node(1,"Computer",0);
- treeList.add(n);
- n = new Node(2,"Java",1);
- treeList.add(n);
- n = new Node(3,"C#",1);
- treeList.add(n);
- n = new Node(4,"Php",1);
- treeList.add(n);
- n = new Node(5,"Thinking in Java",2);
- treeList.add(n);
- n = new Node(6,"Java Core",2);
- treeList.add(n);
- n = new Node(7,"Thinking in C#",3);
- treeList.add(n);
- n = new Node(8,"C# Core",3);
- treeList.add(n);
- n = new Node(9,"Thinking in Php",4);
- treeList.add(n);
- n = new Node(10,"Php Core",4);
- treeList.add(n);
- }
- public List<Node> getNodes(){
- return treeList;
- }
- }
然后再看下页面,
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@ page import="dtree.model.*" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <%@page import="dtree.db.NodeDb"%>
- <%@page import="java.util.Iterator"%><html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Show Tree</title>
- <link rel="StyleSheet" type="text/css" href="dtree.css" />
- <script type="text/javascript" src="dtree.js"></script>
- </head>
- <body>
- <%
- NodeDb ndDb = new NodeDb();
- Iterator<Node> treeIt = ndDb.getNodes().iterator();
- StringBuffer sbf = new StringBuffer();
- // 定义js树对象
- sbf.append("dtree = new dTree(\"dtree\");");
- while(treeIt.hasNext()){
- Node nd = treeIt.next();
- // 增加 js树结点
- sbf.append("dtree.add("+nd.getId()+","+nd.getPId()+",\""+nd.getName()+"\");");
- }
- // 输出js树
- sbf.append("document.write(dtree);");
- %>
- <script type="text/javascript">
- // 执行生成的js字符串
- eval('<%=sbf.toString()%>');
- </script>
- </body>
- </html>
就这样几步,我们并能通过从(模拟)数据库里取出的数据动态的在页面上生成我们的树,如下显示:

到此为止,一个完整的树已经建立完成,可以看到这个过程非常简单。
但上面的页面代码中有个问题,就是包含了大量的逻辑代码,为了减少这些代码以让页面代码更象“页面代码”,将上面的例子作如下改变:
首先,我们在 数据库操作类里新增一个方法,很显然该方法便是用来生成 js 字符串的,如下:
- // 返回定义且生成页面树的 js 字符串
- public String getJSTreeString(){
- Iterator<Node> treeIt = getNodes().iterator();
- StringBuffer sbf = new StringBuffer();
- // 定义js树对象
- sbf.append("dtree = new dTree(\"dtree\");");
- while(treeIt.hasNext()){
- Node nd = treeIt.next();
- // 增加 js树结点
- sbf.append("dtree.add("+nd.getId()+","+nd.getPId()+",\""+nd.getName()+"\");");
- }
- // 输出js树
- sbf.append("document.write(dtree);");
- return sbf.toString();
- }
然后再看看这次少得可怜的页面代码:
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <%@page import="dtree.db.NodeDb"%><html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Show Tree</title>
- <link rel="StyleSheet" type="text/css" href="dtree.css" />
- <script type="text/javascript" src="dtree.js"></script>
- </head>
- <body>
- <script type="text/javascript">
- eval('<%=new NodeDb().getJSTreeString()%>');
- </script>
- </body>
- </html>
这样改后,运行效果与前面完全一样。
上面的例子是对一个具体的业务生成的一颗树,如果我们的 model 改变,则需要完全再重写生成树的代码,所以可以考虑利用反射机制写一个通用的生成树的类,不过有没有这个必要也不好说,因为一个项目应该也不会有很多颗树,而且不用反射来的更快些。
其实生成一颗符合需求的树远远没有上面那么简单,不过 dTree 也能做出功能很强大的树来,这需要在构造结点时添加更多需要的属性,其实方法与上面还是一样,参考文档即可。
如果有其他方法请与我分享,谢谢。
dTree 动态生成树的更多相关文章
- dTree动态生成树(后台处理,简化前台操作)
dTree是个很方便在页面生成树的 js 控件,如果你下载了,我猜里在几分钟之内便能在页面上显示出一颗树来. 它本身给的例子是通过一些静态数据构造树,下面我说一种通过查询的数据动态构造树的方法. 例子 ...
- jstree动态生成树
前篇文章简单介绍了静态生成树,这篇文章将通过后台把数据通过json形式传到前台,进行动态生成树. 本篇的程序所用框架为Spring MVC,可以很方便的通过controller层传json到前台. 前 ...
- JSON动态生成树
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ztree实现左边动态生成树,右边为具体信息功能
页面原型图: 图片.png 功能需求:点击左边树上的子节点,像后台发送请求,将请求到的信息展示在右边的表单里面 前端代码实现: 引入css文档: <link rel="styleshe ...
- jstree静态生成树并为树添加触发事件
本章将介绍如何简单的使用jstree生成树(生成树的数据是静态的),并为树添加点击事件. 1. 建一个jsp页面,引入jquery.js(在其他js前引用),引入jstree所需的js,css文件(可 ...
- Spring多数据源解决方案
Figure 2 多数据源的选择逻辑渗透至客户端 解决方案 Figure 3 采用Proxy模式来封转数据源选择逻辑 通过采用Proxy模式我们在方案实现中实现一个虚拟的数据源.并且通过它来封装数据源 ...
- Ext.Net学习笔记23:Ext.Net TabPanel用法详解
Ext.Net学习笔记23:Ext.Net TabPanel用法详解 上面的图片中给出了TabPanel的一个效果图,我们来看一下代码: <ext:TabPanel runat="se ...
- [LCT应用]
维护动态生成树,建树方法:假设边edge(x,y),则建立x ->edge->y的先后顺序.
- Web应用程序开发,基于Ajax技术的JavaScript树形控件
感谢http://www.cnblogs.com/dgrew/p/3181769.html#undefined 在Web应用程序开发领域,基于Ajax技术的JavaScript树形控件已经被广泛使用, ...
随机推荐
- 深入了解MySQL存储索引
(一)关于存储引擎 创建合适的索引是SQL性能调优中最重要的技术之一.在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,以及存储引擎的差异如何影响到 ...
- Switch Game :因子数
A - Switch Game Problem Description There are many lamps in a line. All of them are off at first. A ...
- Tensorflow、Pytorch、Keras的多GPU使用
Tensorflow.Pytorch.Keras的多GPU的并行操作 方法一 :使用深度学习工具提供的 API指定 1.1 Tesorflow tensroflow指定GPU的多卡并行的时候,也是可以 ...
- mysql 多查询临时表的运用
SELECT * from (select count(*) imgCount1 from imagetable where SeriesID = '1201061992020630292018092 ...
- 总结在Visual Studio Code运行node.js项目遇到的问题
一.cannot find module “lodash” 项目运行时出现以下错误: Error: Cannot find module 'lodash' at Function.Module._re ...
- 2018软工实践—Alpha冲刺(4)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...
- 福大软工1816 - 404 Note Found选题报告
目录 NABCD分析引用 N(Need,需求): A(Approach,做法): B(Benefit,好处): C(Competitors,竞争): D(Delivery,交付): 初期 中期 个人贡 ...
- vs2015关于_CRT_SECURE_NO_WARNINGS警告说明
vs2015关于_CRT_SECURE_NO_WARNINGS警告说明 在VS中调用 strcpy.strcat 等函数时会提示 _CRT_SECURE_NO_WARNINGS 警告,原因是这些函数不 ...
- 操作系统作业一——仿CMD
实验一.CMD实验 2014商软2 卓宇靖 4238 一. 实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3)掌握C语言编程初步. 二. ...
- c99标准的restrict关键字
参考自restrict restrict解释 restrict关键字出现于C99标准,wiki上的解释restrict from wiki. In the C programming language ...