基于Ext的TreeNode实现的tree有两种方式加载:一种是同步树,即生成完整的tree。另外一种是异步树,即点击父节点时才生成子节点。对于节点过多的树,推荐使用异步方式加载树节点;对于节点较少的树,可以使用同步方式加载树节点,即完整生成树节点。此文所谈的即是基于ExtJs的同步树的实现方法。
这里只介绍同步树的的后台实现,对于页面js实现,及数据库表结构,实现图等均不鳌述,相应内容请参考我的Blog中此文的姊妹篇“基于Ext异步加载tree的实例”:http://seraph115.iteye.com/blog/246924
1. 同步树的节点实体代码,于异步实体的区别在于多了children域,在转换为json数据时包含了Ext树所能解析的children内容
/**
* 类说明: 同步加载树型结点<br>
* 创建时间: 2008-8-13 上午10:15:25<br>
*
* @author Seraph<br>
* @email: seraph115@gmail.com<br>
*/
public class TreeNode extends BaseObject {
private String id;
private String text;
private boolean leaf;
private boolean disabled;
private String cls;
private String iconCls;
private String href;
private String hrefTarget;
private String listeners;
private List children = new ArrayList(); // 存放子结点
// Omit the get and set method
... ...
}
2. 对于同步树构造模型数据的后台实现,以迭代方法实现,即给定一个根节点id,查询其下级节点,如是叶节点则表示是节点的终端,如不是叶节点则表示还包含下级节点,以迭代方式继续查询下级节点。
public TreeNode getTreeNodes(TreeNode treeNode) {
BigDecimal id = NumberUtils.createBigDecimal((treeNode.getId()));
ScTreeMenu scTreeMenu = scTreeMenuDAO.selectByPrimaryKey(id);
if(scTreeMenu != null) {
try {
BeanUtils.copyProperties(treeNode, scTreeMenu);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
ScTreeMenuExample example = new ScTreeMenuExample();
example.setParent(id);
example.setParent_Indicator(ScTreeMenuExample.EXAMPLE_EQUALS);
List list = scTreeMenuDAO.selectByExample(example);
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
ScTreeMenu temp = (ScTreeMenu) iterator.next();
TreeNode childNode = new TreeNode();
try {
BeanUtils.copyProperties(childNode, temp);
// 判断是否为子节点
if (Boolean.getBoolean(scTreeMenu.getLeaf())) {
treeNode.addChild(childNode); // 如是,添加此节点
} else {
childNode = getTreeNodeByRole(childNode);
treeNode.addChild(childNode); // 如不是,迭代查询其子节点,并添加
}
} catch (Exception e) {
e.printStackTrace();
}
}
return treeNode;
}
to be continue...