java 树怎么弄
我的数据库主要就2个字段,一个是serviceId,一个是parentCatalogId,parentCatalogId为空表示该serviceId为根目录,不为空,表示该serviceId的上层目录为parentCatalogId所对应的值,动态展示我做出来了,但是头让我做个一次显示所有目录的出来,有点搞不定了,来求教
[解决办法]
你的动态展示是什么意思。
不就是树形菜单展示吗?
[解决办法]
你是说在JSP里怎么展现这颗树的数据吗?
[解决办法]
先说你要用什么来展现数据吧,展现方式的不同,决定策略的不同
[解决办法]
用dtree不可以吗?
[解决办法]
你问的问题就好像一个人到了饭馆然后和别人说:我要吃饭,然后就坐那里等着别人上饭了
[解决办法]
后台负责查询数据,展现放到页面去做,用jquery就能做到你说的动态效果。
[解决办法]
其实你后台用什么数据结构都可以,就算是一条记录用一个字符串都没问题,
只要你能够在前台分析出那个是根,然后依次添加根后面的子就可以。
言归正传,说说我的思路:首先我会有一个类来记录查询出来的数据,也就是javaBean
然后sql在查询的时候按CatalogId升序排列,这样可以保证一个顺序,然后将查询出的
每一条数据用javaBean装载,再用一个list来装所有的javaBean,然后setAttribute,你懂的
然后就是前台依次取数据了(因为已经排序了,所取的效率高),然后构造树
当然如果有的树组件支持一次性load树形数据,那么只要构造出他要求的数据格式就可以了
[解决办法]
如果使用dtree的话,在add方法里有一个字段是open,通过设置这个字段可以设置节点第一次加载是否打开
[解决办法]
还是没看明白你的问题重点,
你是准备数据没有,还是不知道如何展开显示(这是前台的事),
[解决办法]
你可以用递归来实现这种功能
比如有:
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。一个递归就可以完成一棵树了。
[解决办法]
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); //第三层
.....
[解决办法]
他的数据本身就是一颗树,展现一颗树和怎么存放一颗树完全是两回事,如果数据本身就是一颗
树,就算你存放的顺序乱七八糟,也可以在展现时展现成一颗树,我觉得楼主没搞明白这个道理
展现的时候只要找到所有的根,然后一次添加每个根下的直接后继子数据就可以了,循环如此
真的和数据存成什么样子没关系
[解决办法]
NO,你完全搞错javaBean了
[解决办法]
是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);
[解决办法]
json 递归
[解决办法]
递归试试看看
[解决办法]
然后用递归就可以展示了。
[解决办法]

[解决办法]
定义个类:节点ID,父节点ID,是否有孩子节点等等信息。根据25楼sql查出来就可以了