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