`
yesjavame
  • 浏览: 696964 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

阅读更多


在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

分享到:
评论

相关推荐

    jtree和QQ项目\带有右键的树(数据库)

    每个节点可以代表一个对象,并且可以拥有子节点,形成一棵树形结构。创建`JTree`时,通常会提供一个`DefaultTreeModel`或自定义的`TreeModel`,用来存储和管理这些节点。在本项目中,`JTree`可能被用于展示数据库中...

    xml与数据库中数据的导入导出

    DOM将整个XML文档加载到内存中,形成一棵节点树,适合小规模的XML处理;SAX是事件驱动的解析器,按顺序读取XML文件,不保存整个文档,适用于大文件;StAX是基于流的解析器,允许程序以读取或写入的方式遍历XML文档,...

    安卓Android源码——树形主键.rar

    而在树形结构中,主键可能由多个值组成,这些值形成一个路径,就像一棵树的分支,每个节点都有一个或多个键来定义其位置。在Android系统中,这样的设计允许更灵活的数据组织和检索,比如在实现文件系统的目录结构...

    treeview 插件

    Treeview控件在Windows应用程序中非常常见,它通常以缩进的节点形式展示数据,每个节点可以有子节点,形成一棵树状结构。在VFP中,通过Treeview插件,开发者可以方便地在程序界面中添加这种控件,用于显示和管理...

    TreeView与数据表关联应用实例

    1. **TreeView控件**: TreeView控件在用户界面中呈现为一棵树形结构,每个节点可以代表一个对象,并且可以展开或折叠来显示或隐藏子节点。在DELPHI中,TreeView控件通常是TTreeView类型,它支持添加、删除、编辑节点...

    TreeVIew树菜单控件

    `TreeView`控件提供了一个可扩展的节点结构,每个节点可以包含子节点,形成一棵树。这些节点可以代表不同的数据项,如网页链接、文件夹、数据库记录等。通过点击节点,用户可以展开或折叠其子节点,展示或隐藏相关...

    C#表达式树教程

    当这些表达式被转换为表达式树时,每个节点都代表表达式的一部分,而整棵树则反映了表达式的完整结构。根节点通常代表整个表达式,而叶子节点则代表操作数(如变量或常量)。 在C#中,`System.Linq.Expressions`...

    [其他类别]JSP无限级分类目录树_sorttree.rar

    每个节点代表一个分类,可以有一个或多个子节点,形成一棵倒置的树状结构。在JSP中,目录树可以通过HTML或JS进行渲染,以便用户交互。 4. **递归算法**:实现无限级分类目录树的关键在于递归。在Java或JSP中,通过...

    数据结构与算法

    生成树是从无向图中选择边形成的一棵树。 - **有向图的强连通分量:** - 强连通分量是有向图中的最大子图,其中任意两个顶点都是互相可达的。 - **最小生成树:** - 最小生成树是从图中选择的边形成的树,这些边...

    sql解析代码

    接着,语法分析器(Parser)根据预定的语法规则验证这些标记序列是否合法,并生成抽象语法树(Abstract Syntax Tree, AST),这棵树结构直观地表示了SQL语句的结构和逻辑。 2. SQL解析的挑战: - 语言复杂性:SQL...

    2021-2022计算机二级等级考试试题及答案No.19649.docx

    18. "树的根结点数目是有且只有1" - 树的基本性质,一棵树只有一个根节点。 19. "字符串IBM中的字母B占用的二进制位个数是8" - 在计算机中,一个字符通常用一个字节(8位)来存储。 20. "For k = 35 TO 0 Step 3 :...

    数据结构与算法java中文

    - **线性结构与非线性结构**:线性结构中元素之间是一对一的关系,而非线性结构中元素之间可能是一对多的关系。 **2.1.2 抽象数据类型** - **ADT 定义**:抽象数据类型是对数据类型的抽象化描述,只关注数据的操作...

    文件方式保存和恢复treeview  

    1. TreeView控件:TreeView是Windows Forms或WPF中的一种控件,它可以显示一系列互相关联的节点,每个节点可以有自己的子节点,形成一棵树形结构。这些节点通常代表文件系统、数据库结构或其他层次数据。 2. 节点...

    treeForm.rar

    在Delphi中,树形控件(TreeView)常用于显示层次化的数据,例如文件系统目录或数据库记录的层级关系。 1. **树形控件(TreeView)**: TreeView是Delphi中的一种标准组件,它允许程序员创建和展示分层的数据结构...

    2021-2022计算机二级等级考试试题及答案No.10601.docx

    根据完全二叉树的性质,可以推断出这棵树的高度为10(因为\(2^9 ^{10}\)),因此叶子节点的数量为\(2^9 = 512\)。然而,题目提供的答案为350,这与计算不符,可能存在题目信息不准确的情况。 #### 5. C++源程序中的...

    源代码-HotBook XML留言本 v1.1.zip

    DOM将整个XML文档加载到内存中形成一棵树形结构,方便遍历和操作;SAX则采用事件驱动方式,逐行读取XML,适合处理大型XML文件。 4. 留言本功能: HotBook XML留言本的核心功能包括: - 用户提交留言:用户通过表单...

    prueba_treeview_delphi_

    它由节点(TreeNode)组成,每个节点可以有子节点,形成一棵树。在Delphi 7中,TreeView组件位于VCL(Visual Component Library)库的TTreeview类下。 1. **创建和设置TreeView** - 在Delphi 7的Form Designer中,...

    VirtualTreeViewV5.2.1

    每个节点可以有子节点,形成一棵树状结构。Delphi 自带的 TTreeView 组件能够处理基本的树形视图操作,但 VirtualTreeView 提供了更多的高级特性。 2. **Virtualization** "Virtual" 在这里意味着组件只在需要时才...

Global site tag (gtag.js) - Google Analytics