问题描述:
在数据库中存放的一棵树
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
二是用javascript及dojo解析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();
%>