我的数据库主要就2个字段,一个是serviceId,一个是parentCatalogId,parentCatalogId为空表示该serviceId为根目录,不为空,表示该serviceId的上层目录为parentCatalogId所对应的值,动态展示我做出来了,但是头让我做个一次显示所有目录的出来,有点搞不定了,来求教

解决方案 »

  1.   

    你是说在JSP里怎么展现这颗树的数据吗?
      

  2.   

    在后台程序不能体现这种结构么?我不怎么关心前台的,而且我们用ZK,我本来是想用list和map嵌套来实现的,但是没成功……
      

  3.   

    dtree应该可以,问题是后台需要给出什么样的数据才能支持前台的这种展示呢
      

  4.   

    后台负责查询数据,展现放到页面去做,用jquery就能做到你说的动态效果。
      

  5.   

    其实你后台用什么数据结构都可以,就算是一条记录用一个字符串都没问题,
    只要你能够在前台分析出那个是根,然后依次添加根后面的子就可以。
    言归正传,说说我的思路:首先我会有一个类来记录查询出来的数据,也就是javaBean
    然后sql在查询的时候按CatalogId升序排列,这样可以保证一个顺序,然后将查询出的
    每一条数据用javaBean装载,再用一个list来装所有的javaBean,然后setAttribute,你懂的
    然后就是前台依次取数据了(因为已经排序了,所取的效率高),然后构造树当然如果有的树组件支持一次性load树形数据,那么只要构造出他要求的数据格式就可以了
      

  6.   

    如果使用dtree的话,在add方法里有一个字段是open,通过设置这个字段可以设置节点第一次加载是否打开
      

  7.   

    你可以用递归来实现这种功能
    比如有:
       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。一个递归就可以完成一棵树了。
      

  8.   

    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); //第三层
    .....
      

  9.   

    是oracle吧,
    小技巧
     select id,parent_id,LEVEL  from table start with id='根结点ID' connect by prior id=parent_id  
      

  10.   

    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);
      

  11.   

    javaBean和用map感觉差不多吧……或者是我本身javaBean理解的不够,去查查javaBean先
      

  12.   

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

  13.   

    public static List<Map<String, Object>> getCatalog(List<Map<String, Object>> list, String rootId) {        List<Map<String, Object>> result = FastList.newInstance();
            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;
        }
      

  14.   

    这还是最后用了递归做的,结果如下:[[parentCatalogId=null, serviceId=1, list=[[parentCatalogId=1, serviceId=3, list=[[parentCatalogId=3, serviceId=5]]], [parentCatalogId=1, serviceId=4]]], [parentCatalogId=null, serviceId=2]]
    做事做出来了,不过还是不太懂,慢慢研究下