ITPub博客

首页 > 数据库 > 数据库开发技术 > 根据数据库中取记录自定义一棵树结构 (转)

根据数据库中取记录自定义一棵树结构 (转)

原创 数据库开发技术 作者:worldblog 时间:2007-12-11 13:49:48 0 删除 编辑
根据数据库中取记录自定义一棵树结构 (转)[@more@]


servlet/JSP开发中,我们可能也会涉及到树结构的定义问题,比如从数据库中取出记录并定义一个XML树用于论坛结构的显示等。
因为是servlet,使用Java swing中提供的JTree并不现实。

其实一棵实现基本功能的树并不复杂,所以我们自已动手。

首先,在数据库的结构一般是这样的几个字段不能少:

int id  节点id
int pid  父节点id
String title 显示字串
......

(其实前两个节点维持着树的结构是最重要的,后面你想怎么加都行了......)

然后我们来定义一个树节点类,代码如下:

/**
* 自定义的树结点
* @author:sharetop(Mailto:sharetop@hotmail.com">sharetop@hotmail.com)
*/
import java.util.*;

class CTreeNode
{
  int id; /*点ID号,对应数据库相应字段*/
 String title=null; 
 String href=null;
 
 CTreeNode parent=null; /*父节点对象*/
 Vector allChild; /*保存了全部子节点*/
 
 /**
 *构造
 */
 CTreeNode()
 {
 allChild=new Vector();
 }
 
 /**
 *加子节点
 */
 void addChild(CTreeNode child)
 {
 allChild.add(child);
 }

 /**
 * 根据ID递归查找子节点,返回节点对象
 */
 CTreeNode findChild(int id)
 {
 if( id==this.id ) return this;
 for( Enumeration e = allChild.elements();e.hasMoreElements();)
 {
 CTreeNode temp = (CTreeNode)e.nextElement();
 if( temp.id==id ) return temp;
 CTreeNode tmp = temp.findChild(id);
 if( tmp!=null )return tmp;
 }
 return null;
 }
 
 /**
 * 生成一个XML字串
 */
 String create()
 {
 StringBuffer result= new StringBuffer();
 result.append(" result.append(title);
 result.append("" href="");
 result.append(href);
 result.append("" >");
 if( allChild.size()!=0 ){
 for( Enumeration e = allChild.elements();e.hasMoreElements();) {
 CTreeNode temp = (CTreeNode)e.nextElement();
 result.append(temp.create());
 }
 }
 result.append("
");
 return result.toString();
 }
 
}

 

 

好了,然后就是我们在servlet中如何使用这个类了:

在我们的TestServlet.java中加一个方法:

private String getXMLResult()
{
 StringBuffer result = new StringBuffer();
 
 /*这里是树根*/
 CTreeNode root = new CTreeNode();
 root.id=0;
 root.title="根目录";
 root.href="";
 
 try{
 Connection con = dbpool.getConnection();
 PreparedStatement ps = con.prepareStatement("select * from block order by id");
 ResultSet rs = ps.executeQuery();
 
 while( rs.next() ){
 /*每一条记录对应一个节点,关键是找到它在树上所处的位置*/
 CTreeNode node = new CTreeNode();
 node.id=rs.getInt("id");
 node.title=rs.getString("title");
 node.parent=root.findChild(rs.getInt("pid"));
 node.href=node.title+".html";
 node.parent.addChild(node);
 } 
 rs.close();
 ps.close();
 con.close();
 dbpool.freeConnection(con);
 }
 catch( Exception ex )
 {
 System.err.println("Error in Update - sqlBean : rn");
 ex.printStackTrace(System.err);
 return "";
 }
 return root.create();
 }

就是这么简单,TestServlet的doGet方法我也给在下面吧

  public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException
  {
 resp.setContentType("text/xml;charset=gb2312");
 PrintWriter out = resp.getWriter(); 
       
  out.println("");
 
 out.println(getResult());  
   
 out.flush();
 out.close();
 }

有兴趣可以测试一下。

这只是一个基本的树结构,如果要让它符合你的要求,你需要对它进行扩充,欢迎与我讨论 sharetop@hotmail.com

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-991415/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2404238