dTree动态生成树(后台处理,简化前台操作)
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 动态生成树
http://luohua.iteye.com/blog/451453 dTree 主页:http://destroydrop.com/javascripts/tree/ dTree是个很方便在页面生 ...
- ios 从前台返回到回台 从后台返回到前台 或者 支付宝支付订单后 对界面进行操作
正常情况下,在AppDelegate中实现下面两个方法,能够监听从后台恢复到前台 - (void)applicationDidEnterBackground:(UIApplication *)appl ...
- SAP跟踪前台操作导致的后台查询语句
SAP跟踪前台操作导致的后台查询语句,通过这个可以查看前台对应了后台的数据库表,然后可以通过se11查看表内容,也可以删除表内容. 在sap升级的时候,首先需要拷贝正式的sap系统,然后将拷贝的系统中 ...
- jstree动态生成树
前篇文章简单介绍了静态生成树,这篇文章将通过后台把数据通过json形式传到前台,进行动态生成树. 本篇的程序所用框架为Spring MVC,可以很方便的通过controller层传json到前台. 前 ...
- 【SAP业务模式】之ICS(三):前台操作
本片博文开始讲解SAP前台是如何实现ICS业务模式的. 一.VA01开立销售订单 我这里为了方便,创建了一个订单类型ZMIV作为公司间销售的订单类型,其实公司间销售订单跟标准的销售订单是一致的.同时, ...
- ASP.NET中后台数据和前台控件的绑定
关于ASP.NET中后台数据库和前台的数据控件的绑定问题 最近一直在学习个知识点,自己创建了SQL Server数据库表,想在ASP.NET中连接数据库,并把数据库中的数据显示在前台,注意,这里的数据 ...
- java怎样把后台值传到前台
后台代码:if(this.Request["type"]!=null){aaa=this.Request["type"].ToString(); try{bbb ...
- 八:SpringBoot-集成JPA持久层框架,简化数据库操作
SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...
- Luffy /2/ 后台数据库配置&前台创建配置
目录 二次封装Response 后台数据库配置 命令操作 pycharm连接 django操作mysql 方式一 方式二 user表设计 前台创建及配置 全局css样式配置 配置文件配置 二次封装Re ...
随机推荐
- 17.3.12----math模块
1----math模块提供很多的数学运算功能: math.pi 圆周率 math.e 那个自然常熟就是e^x,的这个e math.ceil(i) 对i向上取整 math.floor(i) ...
- Ubuntu--- 安装VMware 报错 Build enviroment error!
今天从 Ubuntu 安装 VMware 下载并安装过程都很顺利,但是在启动过程中报错误,所以总结如下: 报错原因:VMware 第一次启动需要编译一些模块,但是刚开始并没有安装 gcc 所以便报无法 ...
- 查看jks文件中的签名
1. 打开CMD命令行进入本机安装的jdk或jre下的bin目录. 2. 下来看图 keytool -list -v -keystore C:\Users\Administrator\Desktop\ ...
- day66-CSS伪类选择器和伪元素选择器
1. 伪类选择器:hover 和 focus 比较常用. 1.1 hover:把鼠标移动到内容迈腾2020款TSI DSG舒适型的时候,字体变成了红色. html: <body> < ...
- redis 会丢数据吗
不管是以前的主从模式(哨兵模式),还是现在的集群模式,因为都用了slave of 同步; 而slave of 同步会丢弃本地数据,直接用对方的数据来覆盖本地,所以会丢失数据 1.主备网络不通,后续主节 ...
- Huffman编码实验
一. 实验目的 熟练掌握哈夫曼树的建立和哈夫曼编码的算法实现. 二. 实验内容 根据哈夫曼编码的原理,编写一个程序,在用户输入结点权值的基础上求赫夫曼编码,并能把给定的编码进行译码. 三. 实验要求 ...
- BTree非递归
preorder void PreOrder(BTNode* b) { BTNode* p = b; SqStack* st; InitStack(st); if (b != NULL) { Push ...
- callable和runnable的区别
Runnable接口源码 @FunctionalInterface public interface Runnable { /** * When an object implementing inte ...
- iOS之input file调用相册控制器消失跳转到登陆页
最近在做一个app要用到H5,其中有一个需求是要点击H5的的控件弹出系统相册,通过在H5的input file 中定义<input type="file" class=&qu ...
- Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_全局变量的妙用_遍历穿透
1 比如我这边写了一个函数,这个函数中有一个变量作为参数,给定这个参数一个值,然后这个函数返回给我一个值.但是,我写这函数的时候,这个传参我不写到函数里面.可以通过全局变量的方式进行在外部穿透遍历. ...