public class User{private User(int id){ this.id = id; }private int id;private List<User> children; .... }User L1 = new User(1); //头 User L2 = new User(2); List list1 = new ArrayList(1); list1.add(L2); L1.setChildren(list1); //第二层User L3 = new User(3); List list2 = new ArrayList(2); List2.add(L3); L2.setChildren(list2); //第三层 .....
是oracle吧, 小技巧 select id,parent_id,LEVEL from table start with id='根结点ID' connect by prior id=parent_id
class User { private String catalogId; private String serviceId; private String parentId;
public String getCatalogId() { return catalogId; } public void setCatalogId(String catalogId) { this.catalogId = catalogId; } public String getServiceId() { return serviceId; } public void setServiceId(String serviceId) { this.serviceId = serviceId; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } }javaBean这样就可以了 然后你在循环取数据的代码里,例如(伪代码) List list = new ArrayList(); for(循环记录集) { String catalogId = rs.getString("catalog_ID"); String catalogId = rs.getString("serviceId"); String catalogId = rs.getString("parentId"); //进行设值 User user = new User(); user.setCatalogId(catalogId ) .... .... list.add(user); } setAttribute("treeData",list);
只要你能够在前台分析出那个是根,然后依次添加根后面的子就可以。
言归正传,说说我的思路:首先我会有一个类来记录查询出来的数据,也就是javaBean
然后sql在查询的时候按CatalogId升序排列,这样可以保证一个顺序,然后将查询出的
每一条数据用javaBean装载,再用一个list来装所有的javaBean,然后setAttribute,你懂的
然后就是前台依次取数据了(因为已经排序了,所取的效率高),然后构造树当然如果有的树组件支持一次性load树形数据,那么只要构造出他要求的数据格式就可以了
比如有:
ID PID leaf
1 0 0
2 1 1
3 1 1
4 0 0
5 4 1
PID为父子节点,PID=0则为父级任务。leaf是叶子节点,如果叶子节点为true(1),那么本节点就没有孩子了,如果叶子节点为false(0),说明本节点下面还有孩子。
上面的数据就是一棵树
展现形式为:
--1
----2
----3
--4
----5
定义一个方法,查询出所有的父ID,再调用自身,查询自己下面的子ID,直到叶子节点为0。一个递归就可以完成一棵树了。
this.id = id;
}private int id;private List<User> children;
....
}User L1 = new User(1); //头
User L2 = new User(2);
List list1 = new ArrayList(1);
list1.add(L2);
L1.setChildren(list1); //第二层User L3 = new User(3);
List list2 = new ArrayList(2);
List2.add(L3);
L2.setChildren(list2); //第三层
.....
小技巧
select id,parent_id,LEVEL from table start with id='根结点ID' connect by prior id=parent_id
private String catalogId;
private String serviceId;
private String parentId;
public String getCatalogId() {
return catalogId;
}
public void setCatalogId(String catalogId) {
this.catalogId = catalogId;
}
public String getServiceId() {
return serviceId;
}
public void setServiceId(String serviceId) {
this.serviceId = serviceId;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
}javaBean这样就可以了
然后你在循环取数据的代码里,例如(伪代码)
List list = new ArrayList();
for(循环记录集) {
String catalogId = rs.getString("catalog_ID");
String catalogId = rs.getString("serviceId");
String catalogId = rs.getString("parentId");
//进行设值
User user = new User();
user.setCatalogId(catalogId )
....
....
list.add(user);
}
setAttribute("treeData",list);
for (Map<String, Object> map : list) {
String parentCatalogId = (String) map.get("parentCatalogId"); if ((UtilValidate.isEmpty(rootId) && UtilValidate.isEmpty(parentCatalogId))
|| rootId.equals(parentCatalogId)) {
result.add(map);
List<Map<String, Object>> subList = getCatalog(list, (String) map.get("serviceId")); if (UtilValidate.isNotEmpty(subList)) {
map.put("list", subList);
}
}
}
return result;
}
做事做出来了,不过还是不太懂,慢慢研究下