论坛帖子的树状实现
来源:互联网 发布:ip网络功放怎么用 编辑:程序博客网 时间:2024/05/02 07:17
百度贴吧等论坛在几年前推出了“楼中楼”系统,这意味着帖子分为三层:主题-楼层-楼中楼。这很显然是一个树状结构,我这几天试着用jsp实现了这种结构(无限层),顺便练一下新学的MySQL。
对于一个帖子,如何存储在数据库中?我想应该包含如下key:
id,帖子的编号
fid,“父帖子”的编号
rootid,根即帖子所在主题的编号
title,帖子标题(有点多余)
cont,内容
isleaf,是否为叶子
完成数据项的设计后,下面一个问题是:如何树状地展示这些帖子呢?
其实这是一个典型的树的先序遍历+bfs:先输出帖子本身,再逐层向下搜索,直到叶帖子为止。
回复很简单,就是添加结点,只要注意更新父帖子的子帖子数即可。
删除也是bfs,因此要向下一个页面传递父帖子编号,另外要注意更新isleaf。
部分代码:
<%! String str = ""; private void tree(Connection conn, int id, int level) { Statement stmt = null;ResultSet rs = null;String preStr = "";for (int i = 0; i < level; i++)preStr += "----";try {stmt = conn.createStatement();String sql = "select * from article where fid = " + id;rs = stmt.executeQuery(sql);while (rs.next()) {strDel = "<td><a href='delete.jsp?id=" + rs.getInt("id")+ "&fid=" + rs.getInt("fid") + "'>删除</a>";str += "<tr><td>" + rs.getInt("id") + "</td><td>" + preStr+ "<a href='showDetail.jsp?id=" + rs.getInt("id")+ "'>" + rs.getString("title") + "</a></td>" + strDel+ "</td></tr>";if (rs.getInt("isleaf") != 0)tree(conn, rs.getInt("id"), level + 1);}} catch (SQLException e) {e.printStackTrace();} finally {try {if (rs != null) {rs.close();rs = null;}if (stmt != null) {stmt.close();stmt = null;}} catch (SQLException e) {e.printStackTrace();}}}%><%Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost/bbs?user=root&password=root";Connection conn = DriverManager.getConnection(url);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("select * from article where fid = 0");String strDel = "";while (rs.next()) {strLogin = "<td><a href='delete.jsp?id=" + rs.getInt("id")+ "&fid=" + rs.getInt("fid") + "'>删除</a>";str += "<tr><td>" + rs.getInt("id") + "</td><td>"+ "<a href='showDetail.jsp?id=" + rs.getInt("id")+ "'>" + rs.getString("title") + "</a></td>" + strDel+ "</td></tr>";if (rs.getInt("isleaf") != 0) tree(conn, rs.getInt("id"), 1);}rs.close();stmt.close();conn.close();%>
删除帖子:
<%!public void del(Connection conn, int id) {Statement stmt = null;ResultSet rs = null;try {stmt = conn.createStatement();String sql = "select * from article where fid = " + id;rs = stmt.executeQuery(sql);while (rs.next()) {del(conn, rs.getInt("id"));}stmt.execute("delete from article where id = " + id);} catch (SQLException e) {e.printStackTrace();} finally {try {if (rs != null) {rs.close();rs = null;}if (stmt != null) {stmt.close();stmt = null;}} catch (SQLException e) {e.printStackTrace();}}}%><%int id = Integer.parseInt(request.getParameter("id"));int fid = Integer.parseInt(request.getParameter("fid"));Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost/bbs?user=root&password=root";Connection conn = DriverManager.getConnection(url);conn.setAutoCommit(false);del(conn, id);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("select count(*) from article where fid = " + fid);rs.next();int count = rs.getInt(1);rs.close();stmt.close();if(count <= 0) {Statement stmtUpdate = conn.createStatement();stmtUpdate.executeUpdate("update article set isleaf = 0 where id = " + fid);stmtUpdate.close();} conn.commit();conn.setAutoCommit(true);conn.close();response.sendRedirect("show.jsp");%>
缺点是:重复太多;面向对象体现得不够好
过几天会推出改进版。
0 0
- 论坛帖子的树状实现
- 论坛帖子附件的防盗链实现
- 使用ClientSocket控件实现CSDN论坛帖子的自动回复
- 使用ClientSocket控件实现CSDN论坛帖子的自动回复
- asp.net 论坛帖子的手工分页实现
- 记录一下论坛的帖子
- 转另一个论坛的帖子:
- 北邮人论坛的一个帖子
- 多线程的效率问题(论坛帖子)
- 论坛开张第一天的帖子
- 论坛开张第二天的帖子
- 关于对论坛帖子的不同态度
- 看论坛上的一个帖子有感
- 摘自CSDN论坛的一篇帖子
- 使用ClientSocket控件实现CSDN论坛帖子的自动回复(修改)
- 【discuzx2】论坛首页 论坛热点 帖子的后台设置
- php+ajax+mysql论坛帖子异步刷新搜索实现记录
- DeDecms 调用论坛帖子
- SGU 495 Kids and Prizes (概率DP)
- hadoop-2.6.0如何编译,运行WordCount 程序
- 分享WMRNET-I低功耗电能表无线抄表系统 - APPCON
- DP之背包学习记录(二)
- codeforces 167B Wizards and Huge Prize 概率dp
- 论坛帖子的树状实现
- poj 2449 (A* + Dijsktra 求K短路)
- 数据挖掘--支持向量机(SVM)基础
- Codeforces Round #289 C. Sums of Digits(构造)
- eclipse中移除编辑器自动生成的“//TODO comments from auto-generated code”字样
- C语言基础 --指针
- 安卓基于XMLPULSS解析XML的学习
- mac环境下的svn管理代码
- 实习篇---聚会