说是在,真的还是没看懂这个BBS的思路,请教大家了。
先是数据库设计
- SQL code
create table bbs(id int primary key auto_increment,pid int,rootid int,title varchar(255),cont text,pdate datetime,isleaf int);insert into bbs values (null, 0, 1, '蚂蚁大战大象', '蚂蚁大战大象', now(), 1);insert into bbs values (null, 1, 1, '大象被打趴下了', '大象被打趴下了',now(), 1);insert into bbs values (null, 2, 1, '蚂蚁也不好过','蚂蚁也不好过', now(), 0);insert into bbs values (null, 2, 1, '瞎说', '瞎说', now(), 1);insert into bbs values (null, 4, 1, '没有瞎说', '没有瞎说', now(), 0);insert into bbs values (null, 1, 1, '怎么可能', '怎么可能', now(), 1);insert into bbs values (null, 6, 1, '怎么没有可能', '怎么没有可能', now(), 0);insert into bbs values (null, 6, 1, '可能性是很大的', '可能性是很大的', now(), 0);insert into bbs values (null, 2, 1, '大象进医院了', '大象进医院了', now(), 1);insert into bbs values (null, 9, 1, '护士是蚂蚁', '护士是蚂蚁', now(), 0);
核心逻辑是
- Java code
<% ArrayList<Article> articlesList = new ArrayList<Article>(); Connection conn = DB.getConn(); tree(articlesList, conn, 0, 0); DB.close(conn);%>
tree方法
- Java code
try { while (rs.next()) { Article article = new Article(); article.setId(rs.getInt("id")); article.setPid(rs.getInt("pid")); article.setRootId(rs.getInt("rootid")); article.setTitle(rs.getString("title")); article.setPdate(rs.getTimestamp("pdate")); article.setLeaf(rs.getInt("isleaf") == 0 ? true : false); articlesList.add(article); if (!article.isLeaf()) { tree(articlesList, conn, article.getId(), grade + 1); } }
调用tree方法,初始数据是pid为0作为第一个帖子的父ID?第二个0是缩进的。
在递归的时候,为什么总是把当前的帖子ID作为父亲的pid进行查询啊?
------解决方案--------------------
在递归的时候,为什么总是把当前的帖子ID作为父亲的pid进行查询啊?
这个是递归调用
当前id 作为 父id 传进去是 看看 当前id 下面 是否存在 他的孩子
打比方说
当前id=5;
。。。。
tree( , , 5, )
就是用递归调用 把 所有5下面的孩子(所有pid=5的)查找出来;
如果pid为5的 有3个 a, b, c, 当检索到a 时候 又深入进去查找 以a 的id作为父id的 其他项(此时还没有去检索b ,c)
如果a 下面有孩子 g,h,s。就进入检索a下面的孩子 检索 g 时候 再次判断 g 是否有孩子(h,s )还没有检索,就这样一层一层的深入下去 。直到有一个孩子是叶子 (就是他已经是本次检索的最后一个了 他后面没有孩子了) ,,就开始一层一层返回了
返回到g ,然后开始检索 和g 共一个父亲的h ,,一直检索下去 ,返回 后 再 检索 s 这样 一层一层 检索 然后一层一层 返回 。就是这个效果。
------解决方案--------------------
这个数据库详细解释下: id 就不用说了吧。 pid:就是说当前帖子的父节点,也就是说这个帖子回富了的那个帖子的id号。 rootid:就是说这个话题的根节点是哪个,我们知道一个帖子实际上就是一个树状结构,有一个根节点,这个rootid就是说的这个根节点的id号。title cont pdate这些都显而易见,isleaf就是说当前的帖子是不是一个叶子节点,在这个数据库中,0代表是叶子节点,可以理解为他的下面没有了回复的帖子,1则代表有回复帖子,为非叶子节点。