从数据库中取树用json表示并在前台显示

问题描述:

在数据库中存放的一棵树

Child     Parent

1                                null

2                                null

3                                null

4                                1

5                                1

6                                1

7                                4

8                                4

9                                2

10                            2

11                            5

12                            5

即:

null

1        2       3

4    5    6

7    8

11 12

9 10    6

要求动态的将其在页面上显示出来,即:

分两步来做,一是用java从后台取数据库中的数据将其转变成json

二是用javascriptdojo解析json,将其转化为页面上的树。

第二步基本上是现成的搬移代码,难点在第一步,即,如何从数据库中取出树来构建json

Json格式:

var treeNodes = [

       {

           title:"1",

           children:[

                      {title:"4",

                       children:[

                                  {title:"7"},

                                  {title:"8"}]

                      },

                      {title:"5",

                       children:[

                                  {title:"11"},

                                  {title:"12"}]

                       },

                       {title:"6"}]

        },

        {

            title:"2",

            children:[

                       {title:"9"},

                       {title:"10"}]

        },

        {

            title:"3"}

         ];

设计思路:

用两个循环来做,第一个循环处理父节点为null的各个节点,称做根节点。

第二个循环是处理每一个根节点下的所有孩子,即:子树,第二个循环采用的是oracle的递归查询,这样可以一次性以先序的顺序获得所有孩子。

分析json的格式即递归获得的先序序列发现每一个只有四种情况

(1)    父为空,即根节点

(2)    是上一个节点的儿子

(3)    是上一个节点的兄弟

(4)    其他情况

代码:(treeoracle.jsp)

<%@page language="java"

        contentType="text/html;charset=gb2312"

        import="java.sql.*"%>

       <%

       Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

       String url="jdbc:oracle:thin:@festival:1521:festival";

       String user="scott";

       String password="cheng123";

       Connection conn= DriverManager.getConnection(url,user,password);

       Statement

       stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

       out.print("/n");

       //String sql="select * from test";

       String sql="select * from test where parent='null'";

        ResultSet rs=stmt.executeQuery(sql);

        String subsql="";

        String node;

        int i=0;

        ResultSet subrs,subrsp;//subrsp用于保存subrs的前一个节点,目的的便于进行判断

       //rs.next();

       out.print("[");

       //----------构造json-------------

        while(rs.next())//分别做几个父为null

       {

           if(i==0)//第一个节点

            out.print("{");

           else

              out.print(",{");

           node=rs.getString(1);

           subsql="select * from test start with child='"+node+"' connect by prior child=parent";

            Statement

        substmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

            Statement

        substmtp=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

            subrs=substmt.executeQuery(subsql);

            subrs.next();

            subrsp=substmtp.executeQuery(subsql);

            subrsp.next();

            out.print("title:/""+subrs.getString(1)+"/"");//父为空

           while(subrs.next())//做每一根节点下的所有节点

           {

           if(subrs.getString(2).equals(subrsp.getString(1)))//是上一个的儿子

           {

              out.print(",/nchildren:[{");

              out.print("title:/""+subrs.getString(1)+"/"");

           }

           else if(subrs.getString(2).equals(subrsp.getString(2)))//是上一个的兄弟

           {

              out.print("},/n{");

              out.print("title:/""+subrs.getString(1)+"/"");

           }

           else

           {

              out.print("}]/n},{");

              out.print("title:/""+subrs.getString(1)+"/"");

           }

           subrsp.next();

           }

           if(subrsp.getString(2).equals(node))//以中间一层的节点结束,即根的儿子

              out.print("}]}");

           else if(subrsp.getString(1).equals(node))//只有一个节点,即根节点

               out.print("}");

           else

              out.print("}]/n}]}");

           i++;

       }  

       out.print("]");

       rs.close();

       stmt.close();

       conn.close();

       %>

 

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值