如何來做一棵遞歸樹,這在前面的文章中有提過,但那是引用了myfaces組件的,今天就不用啥組件了,直接輸出樹的結構形狀.
數據庫表數據一樣,但還是在此重複一次。
我們的目標是:完成以下形態的樹狀.
--管理
---高級管理員
----增加
----刪除
----修改
---普通管理員
----增加
一、建表
/**
--樹形菜單
節點編號
節點名稱
節點鏈接址
些節點父節點
是否最底節點
節點排序(一般用在同級節點上)
節點說明
*/
drop table EPTreeTable
create 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;
else
temp = 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;
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;
}