1。extjs node 节点类
package com.jijiags.jesen.ExtjsTree;
/*******************************************************************************
* <code>Node</code>类存储ExtjsTree的节点信息.
* <p>节点信息包括:
* id:存储节点的id值.
* parentId:存储节点的父id值.注:当节点的parentId是0时表示该节点为根节点.
* text:节点的名称.
* checked:权限树的节点权限.
*
* @author jesen
* @version 1.0,2009-5-12
* @see ExtjsTree
*/
public class Node {
/** 树节点的id */
private int id;
/**
* 树节点的父id
*/
private int parentId;
private String text = "";
/**
* 权限树的权限节点选中属性
*/
private Boolean checked = null;
Node() {
}
/**
* 构造extjs标准树和菜单树的节点.
*
* @param id
* @param parentId
* @param text
*/
public Node(int id, int parentId, String text) {
this.id = id;
this.parentId = parentId;
this.text = text;
}
/**
* 构造extjs权限树的节点.
*
* @param id
* @param parentId
* @param text
* @param checked
*/
public Node(int id, int parentId, String text, boolean checked) {
this.id = id;
this.parentId = parentId;
this.text = text;
this.checked = checked;
}
public Boolean getChecked() {
return checked;
}
public void setChecked(Boolean checked) {
this.checked = checked;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
2.etjs树实现类
package com.jijiags.jesen.ExtjsTree;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* ExtjsTree类:根据数据库中的权限表生成extjs动态树所需的josntree字符串. <br>
* ExtjsTree类:提供了生成三种Extjs树的字符串. <br>
* 1:标准的josntree字符串. <br>
* 2:生成权限树的josntree字符串.注:权限树的叶子节点是带有checkbox框的具体权限. <br>
* 3:根据具体的叶子节点权限列表,生成叶子节点的父节点树的jonstree字符串.这个jonstree字符串也就功能Tree列表.
*
* @author jesen
* @version 1.0 2009-5-12
*/
public class ExtjsTree {
/***************************************************************************
* 生成jonstree字符串缓存区
*/
private StringBuffer returnStr = new StringBuffer();
/**
* 具有权限的叶子树列表
*/
private List leafList = new ArrayList();
/**
* 根据叶子节点所生成的菜单树列表
*/
private List menuListTree = new ArrayList();
/**
* 生成标准的josntree列表
*/
private List treeList = new ArrayList();
/**
* 是否是权限树的标志,当标志树为true时,生成权限树.注:把所有的叶子节点上加上checkbox对话框.
*/
private boolean isAuthorityTree = false;
/**
* 根据这个跟节点生成树.
*/
private Node root = null;
/**
* 构造一个标准树或一个权限树的实例.
*
* @param root
* Node 树的根节点.根据这个根节点从treeList列表中生成树.
* @param treeList
* List 树列表,来自数据库的权限表.
*/
public ExtjsTree(Node root, List treeList) {// 构造方法里初始化模拟List
this.root = root;
this.treeList = treeList;
}
/***************************************************************************
* 构造一个根据叶子权限节点列表,生成的树的实例.
*
* @param root
* Node 树的根节点.根据这个根节点从treeList列表中生成树.
* @param leafList
* List 叶子节点的列表.来自数据库中的权限表.
* @param treeList
* List 树列表,来自数据库的权限树表.
*/
public ExtjsTree(Node root, List leafList, List treeList) {
this.root = root;
this.leafList = leafList;
this.treeList = treeList;
}
/**
* 判断该节点是否有子节点
*
* @param node
* @return 有子节点放回true.
*/
public boolean hasChild(Node node) {
return getChildList(node).size() > 0 ? true : false;
}
/**
* 获取该节点的子节点列表.
*
* @param node
* @return 返回子节点列表.
*/
public List getChildList(Node node) {
List li = new ArrayList();
Iterator it = this.treeList.iterator();
while (it.hasNext()) {
Node n = (Node) it.next();
if (n.getParentId() == node.getId()) {
li.add(n);
}
}
return li;
}
/**
* 更具该节点的父节点id 获取父节点对象.
*
* @param pid
* @return 返回父节点对象.
*/
public Node getParentNode(int pid) {
Node pNode = null;
Iterator it = this.treeList.iterator();
while (it.hasNext()) {
Node n = (Node) it.next();
if (pid == 0) {
break;
}
if (pid == n.getId()) {
pNode = n;
break;
}
}
return pNode;
}
/**
* 用递归方法计算出该节点的所有子节点.(如果this.isAuthorityTree ==
* ture生成权限树字符串,在叶子节点上加上checkbox选项框)
*
* @param node
*/
public void recursionAllSubNodeFn(Node node) {
if (hasChild(node)) {
returnStr.append("{id:");
returnStr.append(node.getId());
returnStr.append(",parentId:");
returnStr.append(node.getParentId());
returnStr.append(",text:");
returnStr.append("/"" + node.getText() + "/"");
returnStr.append(",expanded:true");
returnStr.append(",children:[");
List childList = getChildList(node);
Iterator it = childList.iterator();
while (it.hasNext()) {
Node n = (Node) it.next();
recursionAllSubNodeFn(n);
}
returnStr.append("]},");
} else {
returnStr.append("{id:");
returnStr.append(node.getId());
returnStr.append(",parentId:");
returnStr.append(node.getParentId());
returnStr.append(",text:");
returnStr.append("/"" + node.getText() + "/"");
if (isAuthorityTree && node.getId() != 1) {
returnStr.append(",checked:");
returnStr.append(node.getChecked());
}
returnStr.append(",leaf:true},");
}
}
/**
* 用递归方法计算出该叶子节点的父节点树.并把这些父节点添加到父节点树中(this.menuTreeList).
*
* @param node
*/
public void recursionAllPNodeFn(Node node) {
node = this.getParentNode(node.getParentId());
if (node == null) {
return;
}
if (this.menuListTree.contains(node)) {
return;
}
this.menuListTree.add(node);
recursionAllPNodeFn(node);
}
/**
* 修饰一下才能满足Extjs的Json格式.
*
* @param returnStr
* 用递归方法生成的jonstree字符串.
* @return 返回满足Extjs动态树的Json格式字符串.
*/
public String modifyStr(String returnStr) {
return ("[" + returnStr + "]").replaceAll(",]", "]");
}
/**
* 根据叶子节点权限列表生成菜单树.
*
* @param leafList
* @return 返回一个菜单树列表.
*/
public List getMenuTreeList(List leafList) {
Iterator it = leafList.iterator();
while (it.hasNext()) {
Node node = (Node) it.next();
this.recursionAllPNodeFn(node);
}
return this.menuListTree;
}
/**
* 根据数据源生成标准的exjts 动态树字符串.
*
* @return 返回标准树字符串.
*/
public String toJsonTree() {
/*
* ----测试数据---- Iterator it = this.treeList.iterator(); while
* (it.hasNext()) { Node n = (Node) it.next();
* System.out.println("nodeid" + n.getId() + " nodepid" +
* n.getParentId()); } ----测试数据----
*/
this.recursionAllSubNodeFn(this.root);
return this.modifyStr(this.returnStr.toString());
}
/**
* 根据数据源生成具有权限的exjts 动态树字符串.
*
* @return 返回权限树字符串.
*/
public String toJsonAuthoratyTree() {
this.isAuthorityTree = true;
return this.toJsonTree();
}
/**
* 根据数据源和权限列表,生成extjs动态树的权限菜单字符串.
*
* @return 返回菜单列表字符串.
*/
public String toJsonMenuTree() {
this.treeList = this.getMenuTreeList(this.leafList);
this.isAuthorityTree = false;
return this.toJsonTree();
}
}