在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 : \r\n");
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