ExtJs+JSP构造动态树

在实际生产中树的构造是需要根据后台数据库中存放的内容动态加载的,例如一个系统中,不同的角色有不同的权限,他们所能进行的操作也是不同的,如果需要构造一个树形结构展现某个角色所能进行的操作,这就用到了树形结构。

ExtJs提供了动态加载树形结构的机制,这里就用到了TreeStore动态加载,常用的动态加载数据格式有JSON和XML。

这里我们看一下如何使用JSON格式数据动态加载属性结构。

首先看一下建立的TreeStore。

var tree_store = Ext.create('Ext.data.TreeStore', {
	    id:'tree_store',
	    proxy: {
   		 type: 'ajax',
   		 url: 'MyJsp.jsp',
   	 }
	});

这里我们通过ajax的方式向一个JSP请求数据。下面看TreePanel的定义。

var treePanel = Ext.create('Ext.tree.Panel', {
	    id: 'tree_panel',
	    title: '动态加载',
	    region: 'west',
	    width: 200,
	    rootVisible: false,
	    store: tree_store,
	    listeners : {
			itemclick : tree_itemclick
		},
		tools: [{
	        type: 'refresh',
	        tooltip: '刷新',
	        handler: function() {//Ext.data.Store load
	            tree_store.load({
	                scope: this,
	                callback: function(records, operation, success) {
	                    treePanel.getRootNode().eachChild(function(child) { child.expand(); });
	                }
	            });
	        }
	    }
	    ],
});

这里需要注意一点,这段代码是卸载onReady()函数中的,而且在加载treePanel之前调用tree_store的load方法。或者将tree_store写在treePanel里面,否则可能造成树形结构无法正常加载显示。

后台最主要的作用是将节点信息组成恰当的JSON字符串,如果需要加载的节点不多的话可以使用拼接字符串的方式,如果节点较多可以使用javaBean封装节点信息,然后通过循环的方式拼接。

下面我们先看一下节点类的定义。

public class Node {
	private String text;//节点显示字符串
	private String id;//节点ID
	private boolean leaf;//是否是叶子节点

	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public boolean isLeaf() {
		return leaf;
	}
	public void setLeaf(boolean leaf) {
		this.leaf = leaf;
	}
}

真实开发中可以从数据库中取出这些节点的一个集合信息,这里我们使用一个普通方法模拟一个节点信息的集合。

public ArrayList<Node> getRes(){
		ArrayList<Node> result = new ArrayList<Node>();

		Node node1 = new Node();
		node1.setId("第一个节点的id");
		node1.setLeaf(true);
		node1.setText("第一个节点");

		Node node2 = new Node();
		node2.setId("第二个节点的ID");
		node2.setLeaf(true);
		node2.setText("第二个节点");
		result.add(node1);
		result.add(node2);

		return result;
	}

下面我们看一下如何根据这个集合来拼接JSON字符

public String getJson(){
		String result = "[{text:'1级文件夹',id:'host',children:[";
		ArrayList<Node> arrlist = getRes();
		Iterator<Node> iterator = arrlist.iterator();
		while(iterator.hasNext()){
			Node node = iterator.next();
			if(iterator.hasNext())
				result +="{id:'"+node.getId()+"',text:'"+node.getText()+"',leaf:"+node.isLeaf()+"},";
			else
				result +="{id:'"+node.getId()+"',text:'"+node.getText()+"',leaf:"+node.isLeaf()+"}";
		}
		result+="]},{text:'2级文件夹',id:'operate',children:[{id:'addhost',text:'第三个节点',leaf:true},"
				+ "{id:'addclient',text:'第四个节点',leaf:true}]}]";
		return result;
	}

在result字符串定义和最后返回之前是使用最普通的字符串拼接的方法,这里一起进行测试。

然后我们看一下url中请求的JSP页面。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<jsp:useBean id="service" class="service.Service"></jsp:useBean>
<%
	request.setCharacterEncoding("utf-8");
	response.setCharacterEncoding("utf-8");
	String json = service.getJson();
	System.out.println(json);
	response.getWriter().write(json);
%>

这样就可以在请求页面的过程中根据后台中的内容动态加载属性结构。

下面看一下效果图:

使用这种方式动态加载时将所有的几点信息一次全部加载,也就是当你点击展开一级文件夹或二级文件夹的时候他不会在想后台发送请求,这里通过firebug就能看出,如果树的层次比较深,在后台构造JSON字符串发送就会比较麻烦,这时可以使用异步加载,也就是当页面第一次加载的时候只会加载1级文件夹和2级文件夹,当点击展开1级文件夹或2级文件夹的时候这时会继续向后退发送请求,请求加载1级文件夹的子节点。关于异步加载将在下篇博客介绍。

时间: 2024-11-02 23:08:59

ExtJs+JSP构造动态树的相关文章

extjs动态树 动态grid 动态列

由于项目需要做一个动态的extjs树.列等等,简而言之,就是一个都是动态的加载功能, 自己琢磨了半天,查各种资料,弄了将近两个星期,终于做出来了 首先,想看表结构,我的这个功能需要主从两张表来支持 代码目录表: CREATE TABLE SYS_T01_CODECONTENT ( ID NUMBER NOT NULL, PID NUMBER NOT NULL, TABLENAME VARCHAR2(50 BYTE), ZH_CN VARCHAR2(200 BYTE), ENABLE CHAR(1

hdu 4010 Query on The Trees(动态树)

题意:给定一幅图的连接情况,给出每个点的权值,四种操作: 1 x y 连接x.y所在子树: 2 x y 将同一棵树上的x,y分离,形成两棵子树: 3 w x y 将x.y之间路径上的所有点权加w: 4 x y 查询x.y路径上点权的最大值: 动态树学习参考:http://www.cnblogs.com/BLADEVIL/p/3510997.html http://wenku.baidu.com/view/75906f160b4e767f5acfcedb http://m.blog.csdn.ne

关于动态树和LCT的一些学习感受(持续更新)

什么是动态树? 动态树(Dynamic Tree)问题是指在树上动态维护相关信息的问题. 一般的动态树问题中,会要求我们维护一个由若干棵子结点无序的有根树组成的森林.并且要求这个数据结构支持对树的分割(删边),合并(加边),对某个点到它的根的路径的某些操作(路径操作).有时,动态树问题还会涉及对某个点的子树进行的某些操作(子树操作),而涉及子树操作问题的动态树问题更加复杂,需要用到更加复杂的数据结构.然而蒟蒻并不会做这种高级的题目,所以就讲讲简单的几种操作. 关于LCT的一些笔记 LCT(Lin

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点X上的权值变成Y. 输入输出格式 输入格式: 第1行两个整数,分别为N和M,代表点数和操

bzoj 2631: tree 动态树+常数优化

2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1716  Solved: 576[Submit][Status] Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:+ u v c:将u到v的路径上的点的权值都加上自然数c:- u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树:* u v c:将u到v的

动态树 Link-Cut Trees

动态树 动态树问题, 即要求我们维护一个由若干棵子结点无序的有根树组成的森林. 要求这个数据结构支持对树的分割.合并,对某个点到它的根的路径的某些操作,以及对某个点的子树进行的某些操作. 在这里我们考虑一个简化的动态树问题,它只包含对树的形态的操作和对某个点到根的路径的操作: 维护一个数据结构,支持以下操作: • MAKE TREE() — 新建一棵只有一个结点的树. • CUT(v) — 删除 v 与它的父亲结点 parent(v) 的边,相当于将点 v 的子树分离了出来. • JOIN(v,

bzoj2243 [SDOI2011]染色 动态树

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 110000 int pre[N],ch[N][2]; int e[N],ne[N*2],v[N*2]; int nn,m; int col[N]; int lc[N],sm[N],rc[N],num[N]; int rt[N],n; int qu[N

【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态树分治

题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打仗了. 在打仗之前,幽香现在面临一个非常基本的管理问题需要解决. 整个地图是一个树结构,一共有n块空地,这些空地被n-1条带权边连接起来,使得每两个点之间有一条唯一的路径将它们连接起来.在游戏中,幽香可能在空地上增加或者减少一些军队.同时,幽香可以在一个空地上放置一个补给站. 如果补给站在点u上,并

康复计划#4 快速构造支配树的Lengauer-Tarjan算法

本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡到$O(m \log n)$上界的办法作为小彩蛋- 1.基本介绍 支配树 DominatorTree 对于一个流程图(单源有向图)上的每个点$w$,都存在点$d$满足去掉$d$之后起点无法到达$w$,我们称作$d$支配$w$,$d$是$w$的一个支配点. 支配$w$的点可以有多个,但是至少会有一个.