如何来做一棵递归树,这在前面的文章中有提过,但那是引用了myfaces组件的,今天就不用啥组件了,直接输出树的结构形状.数据库表数据一样,但还是在此重复一次。
我们的目标是:完成以下形态的树状.--管理---高级管理员----增加----删除----修改---普通管理员----增加一、建表/**--树形菜单节点编号节点名称节点链接址些节点父节点是否最底节点节点排序(一般用在同级节点上)节点说明*/drop table EPTreeTablecreate table EPTreeTable(TreeNodeId int identity(1,1) constraint pk_TreeNode primary key, TreeNodeName varchar(50) not null,TreeNodeLink varchar(100) ,TreeNodeFatherId int default 0, --0 为最高层TreeNodeIsBottom bit default 1, --1 为底层 0为非底层TreeNodeCompositor int default 1, -- 默认排在最后面TreeNodeExplain varchar(200))二、JAVA代码(1)TO对象/*** @author fangbiao* 用于映射父级菜单TO对象*/public class ParentResourcePojo {/*** 节点编号*/private int treeNodeId;/*** 节点名称*/private String treeNodeName;/*** 父节点*/private int treeParentNodeId;/*** @return treeNodeName*/public String getTreeNodeName() {return treeNodeName;}/*** @param treeNodeName 要设置的 treeNodeName*/public void setTreeNodeName(String treeNodeName) {this.treeNodeName = treeNodeName;}/*** @return treeParentNodeId*/public int getTreeParentNodeId() {return treeParentNodeId;}/*** @param treeParentNodeId 要设置的 treeParentNodeId*/public void setTreeParentNodeId(int treeParentNodeId) {this.treeParentNodeId = treeParentNodeId;}/*** @return treeNodeId*/public int getTreeNodeId() {return treeNodeId;}/*** @param treeNodeId 要设置的 treeNodeId*/public void setTreeNodeId(int treeNodeId) {this.treeNodeId = treeNodeId;}}(2)树形组合/*** 获取节点选择列表信息* @return*/public List getResourceList(){if(resourceList.size() == 0) {//获取高级的父节点resourceList = doTurnParentToTree(itbs.getTopParentResource()); }return resourceList;}private int num =2;private int tempTotalChildren ;private boolean temp = false;private int tempParent; //每次递归节点的父节点/*** 对父级列表进行树排* @param prp* @return*/private synchronized List doTurnParentToTree(ParentResourcePojo prp){ if(prp == null)return null;List list = getChildrenList(prp);//分线tempParent = prp.getTreeParentNodeId();String str = "";if(tempParent == 0){resourceList.add("-"+prp.getTreeNodeName()));}else{resourceList.add(prp.getTreeNodeName()));//每棵树的节点数目tempTotalChildren = list.size();}Iterator iterator = list.iterator();while(iterator.hasNext()){ParentResourcePojo treePojo = (ParentResourcePojo)iterator.next();if(tempParent != 0){if( tempParent < treePojo.getTreeParentNodeId()){if(temp == false)num += 1;}else if( tempParent > treePojo.getTreeParentNodeId()){num -=1;temp = false;}else if( tempParent == treePojo.getTreeParentNodeId() ){if(tempTotalChildren ==0)temp = false;elsetemp = true;}}for(int i=0;i<num;i++){str = str + "-";}treePojo.setTreeNodeName(CommonUtil.doAddAppendString(str,treePojo .getTreeNodeName()));str = "";doTurnParentToTree(treePojo);}return resourceList;}/*** 父级菜单列表*/private List allParentTreeList = null;/*** 做标记用*/private int flag = 0;/*** 获取所有父级菜单列表树* @return*/private List getAllParentTreeList(){if(allParentTreeList == null){if(flag == 0){flag = 1;allParentTreeList = itbs.getRRCResource();return allParentTreeList;}return allParentTreeList;}return allParentTreeList;}/*** 取子树列* @param prp* @return*/private List getChildrenList(ParentResourcePojo prp){List list = getAllParentTreeList();int listLength = list.size();List newReturnList = new ArrayList();if(listLength == 0)return newReturnList;List leaveList = new ArrayList();for(int i=0;i<listLength;i++){ParentResourcePojo prPojo = (ParentResourcePojo)list.get(i); int treePojoTreeParantNodeId = prPojo.getTreeParentNodeId(); int tpTreeNodeId = prp.getTreeNodeId();if(treePojoTreeParantNodeId == tpTreeNodeId){newReturnList.add(prPojo);}else{leaveList.add(prPojo);}}list = leaveList;return newReturnList;}到此完成,期间一定要注重同级节点的排序。