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

本文介绍了在servlet/jsp开发中树结构的定义问题。因使用JAVA SWING的JTree不现实,所以手动实现。先说明了数据库结构字段,定义了树节点类,还给出在servlet中使用该类的方法,最后给出TestServlet的doGet方法示例,此为基本树结构,可按需扩充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在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

 

### 创建六层级状数据结构 为了构建一个基于父子关系的六层形结构,可以采用多种方法和技术栈来实现这一目标。这里将以 Java 和 JavaScript 的方式为例说明如何处理这种层次化数据。 #### 使用 Java 构建多级嵌套对象列表 在 Java 中可以通过定义实体类表示单个节点,并通过递归算法遍历整个集合从而形成完整的形结构[^1]: ```java public class TreeNode { private Long id; private String name; private List<TreeNode> children; public void addChild(TreeNode childNode){ if(this.children == null){ this.children = new ArrayList<>(); } this.children.add(childNode); } // Getters and Setters... } ``` 接着编写服务端逻辑读数据库中的记录并组装成上述 `TreeNode` 对象实例组成的列表形式返回给前端页面显示出来。 对于 SQL 方面的操作,则可以根据具体需求设计合适的查询语句获到所有必要的字段信息用于初始化各个节点属性值。例如,在 MySQL 数据库环境下可执行如下命令提所需资料[^2]: ```sql WITH RECURSIVE tree AS ( SELECT * FROM nodes WHERE parent_id IS NULL -- 得根节点 UNION ALL SELECT n.* FROM nodes n INNER JOIN tree t ON n.parent_id = t.id -- 连接子代及其祖先 ) SELECT * FROM tree ORDER BY path; -- 输出带路径的结果集以便后续解析 ``` 此 CTE (Common Table Expression) 表达式能够有效地检索出整棵或多棵的信息链路直至最底层叶子结点为止。 #### 利用 JavaScript 动态渲染视图组件 当涉及到客户端交互时,通常会借助于像 Vue.js 或 React 这样的现代框架来进行高效的状态管理和事件响应机制的设计。不过即使是在纯 JS 环境下也可以轻松完成类似的任务[^3]: 假设已经从前端 API 接口处获得了经过整理后的 JSON 数组作为输入源材料之一的话,那么就可以利用简单的函数去匹配特定条件下的项目进而拼凑出最终想要呈现的效果: ```javascript function buildTree(data, parentId = null) { return data.filter(item => item.parentId === parentId).map(parentItem => ({ ...parentItem, children: buildTree(data, parentItem.id), })); } // 假设 'data' 是从服务器获得的一维数组 const result = buildTree(data); console.log(JSON.stringify(result)); ``` 这段代码片段展示了怎样自定义辅助工具帮助我们快速地建立起任意深度级别的目录体系;当然实际应用场景里可能还需要考虑诸如性能优化、错误捕获等问题以确保系统的稳定性和用户体验感良好。 #### Oracle 数据库环境下的应用案例 如果使用的后台管理系统依赖的是 ORACLE 关系型数据库产品线,那么同样适用之前提到过的标准做法——即先准备好相应的 DDL(Data Definition Language)脚本创建好基本表架构之后再配合 PL/SQL 脚本来填充测试样例供开发者调试验证之用[^4]。 ```sql CREATE TABLE tjbb( id NUMBER PRIMARY KEY, title VARCHAR2(50), pid NUMBER DEFAULT NULL REFERENCES tjbb(id), /* 自关联 */ level_num INTEGER CHECK(level_num BETWEEN 1 AND 6) /* 层次限制 */ ); -- 插入一些初始条目构成简单分支结构 INSERT INTO tjbb VALUES (1,'Root',NULL,1); INSERT INTO tjbb VALUES (2,'Child A',1,2); INSERT INTO tjbb VALUES (3,'Grandchild AA',2,3); ... COMMIT; ``` 以上就是关于如何依据给定的父子节点间的关系建立最多不超过六个等级别的状组织的一些思路分享以及实践指南。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值