实体类:分销商信息实体类(int id,String name),区域信息实体类(char isClient(是否分销商),char isLeal(是否叶子),....),他们的关系是一(区域信息实体类)对多(分销商信息实体类)的关系。展现叶子的逻辑:private void showAreaTree(Area area, int level) {

sbTree.append("<div>");

sbTree.append("\n"); for (int i = 0; i < level; i++) {

sbTree.append("<img src=\"../images/white.gif\">");

sbTree.append("\n");
}
if ("N".equals(area.getIsLeal())) {//区域不是叶子

sbTree.append("<img alt=\"展开\" style=\"cursor:hand;\" onClick=\"display('" + area.getId() +"');\" id=\"img" + area.getId() + "\" src=\"../images/plus.gif\">");

sbTree.append("\n");

sbTree.append("<img id=\"im" + area.getId() + "\" src=\"../images/closedfold.gif\">");

sbTree.append("\n");

sbTree.append("<a href=\"area.do?commandArea=findItem&areaId="+area.getId()+"\" target=\"clientDispAreaFrame\">" + area.getName() + "</a>");

sbTree.append("\n");
//如果区域不是叶子,那么层是默认关闭
sbTree.append("<div style=\"display:none;\" id=\"div" + area.getId() + "\">");

sbTree.append("\n"); for (Iterator<Area> iter = area.getChildren().iterator(); iter
.hasNext();) { Area child = (Area) iter.next(); showAreaTree(child, level + 1);//递归展现树(只对区域有效)
如果上面两个实体类合并成一张表,那么问题就好办了!
for (Iterator<Client> clientIter = child.getClientSet().iterator(); clientIter
.hasNext();) {

//showAreaTree(child, level + 1);
Client client = (Client) clientIter.next(); if ("N".equals(client.getIsClient())) {

}else{
//如果是分销商
for (int i = 0; i < 3*level; i++) {

sbTree.append("<img src=\"../images/white.gif\">");

sbTree.append("\n");
}

if ("N".equals(client.getIsLeal())) { 
//如果分销商不是叶子
//展现分销商
sbTree.append("<img alt=\"展开\" style=\"cursor:hand;\" onClick=\"display('" + client.getId() +"');\" id=\"img" + client.getId() + "\" src=\"../images/plus.gif\">");

sbTree.append("\n");

sbTree.append("<img id=\"im" + client.getId() + "\" src=\"../images/closedfold.gif\">");

sbTree.append("\n");

sbTree.append("<a href=\"client_node_crud.html\" target=\"clientDispAreaFrame\">" + client.getName() + "</a>");

sbTree.append("\n");

sbTree.append("<div style=\"display:none;\" id=\"div" + client.getId() + "\">");

sbTree.append("\n");

sbTree.append("<a href=\"client.do?commandClient=findItemClient&clientId="+client.getId()+"\" target=\"clientDispAreaFrame\">" + client.getName() + "</a>");

//showAreaTree(child, level + 1);

sbTree.append("</div>");
}else {
//如果分销商是叶子
sbTree.append("<img src=\"../images/minus.gif\">");

sbTree.append("<img src=\"../images/openfold.gif\">");

sbTree.append("<a href=\"client.do?commandClient=findItemClientName&clientId="+client.getId()+"\" target=\"clientDispAreaFrame\">" + client.getName() + "</a>");
}

sbTree.append("\n");

sbTree.append("<br>\n");
}
}

}

sbTree.append("</div>");

sbTree.append("\n");

}else{

//区域是叶子
sbTree.append("<img src=\"../images/minus.gif\">");

sbTree.append("\n");

sbTree.append("<img src=\"../images/openfold.gif\">");

sbTree.append("\n");

sbTree.append("<a href=\"area.do?commandArea=findItem&areaId="+area.getId()+"\" target=\"clientDispAreaFrame\">" + area.getName() + "</a>");

sbTree.append("\n");
}

sbTree.append("</div>");
}在两个实体类的情况下:
-----------  -所有区域
----------------  -东北区
--------------------  +吉林省(区域)
------------------------  -吉林医药股份有限公司(分销商)
--------------------  -黑龙江
----------------  -华南区问题:区域所在的层不能包括分销所在的层(即展现树的时候 吉林省 不能包括 吉林医药股份有限公司)请兄弟帮忙!

解决方案 »

  1.   

    dhtmlxTree
    目前做的最好的js树形 控件
      

  2.   

    因为dhtmlxTree 要读取xml文件,请问哪位兄弟知道有什么框架跟Hibernate相结合把从数据库里读出来生成XML文件
      

  3.   

    用js的dtree,研究下,改改就可以了
      

  4.   

    我的问题就是不知道怎样才能把从数据库里读出来的数据生成XML文件,请兄弟指教!
      

  5.   

    开源的很多都通过传对象生成xml的   如 : xstream
      

  6.   

    我已经按照兄弟的指引使用xtream将javabean转换成为xml,但是当我使用dhtmlTree将xml中的数据生成树状结构展现的时候出现了问题,如:erroy type:datastructure description:xml reffers to not extisting parentJavaBean为:(我怀疑是不是我的javabean有问题)@Entity
    @Table(name="t_area")
    public class Area {

    private int id;

    private String name;

    private Area parent;

    private Set<Area> children=new HashSet<Area>();

    private Set<Client> clientSet=new HashSet<Client>(); @OneToMany(mappedBy="area",cascade=CascadeType.ALL)
    public Set<Client> getClientSet() {
    return clientSet;
    } public void setClientSet(Set<Client> clientSet) {
    this.clientSet = clientSet;
    } @Id
    @GeneratedValue
    public int getId() {
    return id;
    } public void setId(int id) {
    this.id = id;
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    }
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="area_id")
    public Area getParent() {
    return parent;
    } public void setParent(Area parent) {
    this.parent = parent;
    }
    @OneToMany(mappedBy="parent",cascade=CascadeType.ALL)
    public Set<Area> getChildren() {
    return children;
    } public void setChildren(Set<Area> children) {
    this.children = children;

    }生成的xml为:<list>
    - <area>
      <id>1</id> 
      <name>所有区域</name> 
    - <children class="org.hibernate.collection.PersistentSet">
      <initialized>true</initialized> 
      <owner class="area" reference="../.." /> 
      <cachedSize>-1</cachedSize> 
      <role>com.tjy.drp.business.entity.Area.children</role> 
      <key class="int">1</key> 
      <dirty>false</dirty> 
    - <storedSnapshot class="map">
    - <entry>
    - <area>
      <id>2</id> 
      <name>东北区</name> 
      <parent reference="../../../../.." /> 
    - <children class="org.hibernate.collection.PersistentSet">
      <initialized>true</initialized> 
      <owner class="area" reference="../.." /> 
      <cachedSize>-1</cachedSize> 
      <role>com.tjy.drp.business.entity.Area.children</role> 
      <key class="int">2</key> 
      <dirty>false</dirty> 
    - <storedSnapshot class="map">
    - <entry>
    - <area>
      <id>3</id> 
      <name>吉林省</name> 
      <parent reference="../../../../.." /> 
    - <children class="org.hibernate.collection.PersistentSet">
      <initialized>true</initialized> 
      <owner class="area" reference="../.." /> 
      <cachedSize>-1</cachedSize> 
      <role>com.tjy.drp.business.entity.Area.children</role> 
      <key class="int">3</key> 
      <dirty>false</dirty> 
      <storedSnapshot class="map" /> 
      <set /> 
      </children>
    - <clientSet class="org.hibernate.collection.PersistentSet">
      <initialized>true</initialized> 
      <owner class="area" reference="../.." /> 
      <cachedSize>-1</cachedSize> 
      <role>com.tjy.drp.business.entity.Area.clientSet</role> 
      <key class="int">3</key> 
      <dirty>false</dirty> 
    - <storedSnapshot class="map">
    - <entry>
    - <com.tjy.drp.business.entity.Client>
      <id>2</id> 
      <name>吉林XXX.xx</name> 
      <bankAcctNo>88888888</bankAcctNo> 
      <contactTel>999999999</contactTel> 
      <address>吉林某市.xx</address> 
      <zipCode>7777777</zipCode> 
    - <clientLevel>
      <id>2</id> 
      <name>二级分销商</name> 
      </clientLevel>
      <area reference="../../../../.." /> 
      </com.tjy.drp.business.entity.Client>
      <com.tjy.drp.business.entity.Client reference="../com.tjy.drp.business.entity.Client" /> 
      </entry>
    - <entry>
    - <com.tjy.drp.business.entity.Client>
      <id>1</id> 
      <name>吉林XXX</name> 
      <bankAcctNo>88888888</bankAcctNo> 
      <contactTel>999999999</contactTel> 
      <address>吉林.xx</address> 
      <zipCode>7777777</zipCode> 
    - <clientLevel>
      <id>1</id> 
      <name>一级分销商</name> 
      </clientLevel>
      <area reference="../../../../.." /> 
      </com.tjy.drp.business.entity.Client>
      <com.tjy.drp.business.entity.Client reference="../com.tjy.drp.business.entity.Client" /> 
      </entry>
      </storedSnapshot>
    - <set>
      <com.tjy.drp.business.entity.Client reference="../../storedSnapshot/entry/com.tjy.drp.business.entity.Client" /> 
      <com.tjy.drp.business.entity.Client reference="../../storedSnapshot/entry[2]/com.tjy.drp.business.entity.Client" /> 
      </set>
      </clientSet>
      </area>
      <area reference="../area" /> 
      </entry>
    - <entry>
    - <area>
      <id>4</id> 
      <name>黑龙江省</name> 数据展现为:
    <body class="body1">
    <script  src="dhtmlxcommon.js"></script>
    <script  src="dhtmlxtree.js"></script>
    <div id="mytree"></div>
    <script>
    tree=new dhtmlXTreeObject("mytree","100%","100%",0);
    tree.setImagePath("images/");
    //设置单击节点的事件
    tree.setOnClickHandler(function(id){openPathDocs(id);});
    //设置节点可以拖动
    tree.enableDragAndDrop(1);
    tree.enableTreeLines(true);
    tree.setXMLAutoLoading("D:/maosenFirst2.xml");
    tree.loadXML("D:/maosenFirst2.xml");
    </script>
    </body>
      

  7.   

    不要在java代码写树菜单,树菜单是客户端页面呈现的东西,它是属于MVC的V层的,是你硬要把它放到C层你所要关心的是如何维护树菜单这张表(包括菜单名,菜单编号,菜单URL,菜单层次级别,菜单信息,等),你所在做的是如何(根据权限、验证等)读取这张表,再通过REQUES传给JSP,剩下的事是JS替你一干的!
      

  8.   

    你的xml为什么要写成这个样子,检查一下你的XML是否符合dhtmlTree所定义的标准,
    <list>根元素也没有闭合!
      

  9.   

    用jquery的树插件做个动态树,省去递归的麻烦,还节省代码运行时间