?? ? ?基于Ext的TreeNode实现的tree有两种方式加载:一种是同步树,即生成完整的tree。另外一种是异步树,即点击父节点时才生成子节点。对于 节点过多的树,推荐使用异步方式加载树节点;对于节点较少的树,可以使用同步方式加载树节点,即完整生成树节点。此文所谈的即是基于ExtJs的同步树的 实现方法。
?? ? ?这里只介绍同步树的的后台实现,对于页面js实现,及数据库表结构,实现图等均不鳌述。
?? ??1. 同步树的节点实体代码,于异步实体的区别在于多了children域,在转换为json数据时包含了Ext树所能解析的children内容
?? ??
/* 类说明: 同步加载树型结点<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; }?
?
?