根據資料庫中取記錄自定義一棵樹結構 (轉)

worldblog發表於2007-12-11
根據資料庫中取記錄自定義一棵樹結構 (轉)[@more@]


在/開發中,我們可能也會涉及到樹結構的定義問題,比如從中取出記錄並定義一個樹用於論壇結構的顯示等。
因為是servlet,使用 中提供的JTree並不現實。

其實一棵實現基本功能的樹並不複雜,所以我們自已動手。

首先,在資料庫的結構一般是這樣的幾個欄位不能少:

int id  節點id
int pid  父節點id
String title 顯示字串
......

(其實前兩個節點維持著樹的結構是最重要的,後面你想怎麼加都行了......)

然後我們來定義一個樹節點類,程式碼如下:

/**
* 自定義的樹結點
* @author:sharetop(to:sharetop@.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 = new CTreeNode();
 root.id=0;
 root.title="根目錄";
 root.href="";
 
 try{
 Connection con = pool.getConnection();
 PreparedStatement ps = con.prepareStatement(" * 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 - Bean : 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();
 }

有興趣可以測試一下。

這只是一個基本的樹結構,如果要讓它符合你的要求,你需要對它進行擴充,歡迎與我討論

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991415/,如需轉載,請註明出處,否則將追究法律責任。

相關文章