在servlet/jsp开发中,我们可能也会涉及到树结构的定义问题,比如从数据库中取出记录并定义一个XML树用于论坛结构的显示等。 因为是servlet,使用JAVA SWING中提供的JTree并不现实。
其实一棵实现基本功能的树并不复杂,所以我们自已动手。
首先,在数据库的结构一般是这样的几个字段不能少:
int id 节点id int pid 父节点id String title 显示字串 ......
(其实前两个节点维持着树的结构是最重要的,后面你想怎么加都行了......)
然后我们来定义一个树节点类,代码如下:
/** * 自定义的树结点 * @author:sharetop(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("<node title=""); 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("</node>"); 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 : "); 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("<?xml version="1.0" encoding="gb2312" ?>"); out.println(getResult()); out.flush(); out.close(); }
有兴趣可以测试一下。
这只是一个基本的树结构,如果要让它符合你的要求,你需要对它进行扩充,欢迎与我讨论 sharetop@hotmail.com
|