Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

一个用JSP写的论坛的实例(三)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

三:论坛分页技术的实现

  首先创建一个临时表bbs_t,这个表和存放帖子的表结构基本相同,只是这个表的第一个字段为一个自增性的字段类型,然后将存放帖子的表中的所有数据插入这个临时表中:


stmt.executeUpdate("create temporary table bbs_t 
(autoadd int auto_increment primary key,click int,uname char(20),
title text,memo text,id int,rootid int,level int,num int,dtime char(20),
facepath char(40))");
stmt.executeUpdate("insert into bbs_t(click,uname,title,memo,id,rootid,
level,num,dtime,facepath) select click,uname,title,memo,id,rootid,level,
num,dtime,facepath from bbs where forum='"+forum+"' 
order by rootid+idsign(rootid)*id desc,num");

  现在就可以通过这个临时表来进行分页了,以下是实际程序代码:


    <%
      //用来取得整个表中跟帖的总数,用来表示有多少个主题
      RS=stmt.executeQuery("select count(rootid) from bbs_t where rootid=0");
      if(RS.next())
      titleall=RS.getInt(1);
    %>

    <%
      //取得整个表中的帖子数,再与30(每页显示30条帖子)取摸,得到总页数
      RS=stmt.executeQuery("select max(autoadd) from bbs_t");
      if(RS.next()) {
        int p_t=RS.getInt(1);
        if(p_t%30==0)
          pageall=p_t/30;
        else
          pageall=p_t/30+1;
      }
      //每页第一条帖子的ID,初始值为1
      begin=1;
//用来记录当前是第几页,初始值为第一页,当按“下一页”按钮后pagenow的值自动加一;
        反之自动减一
      pagenow=1;
    %>

    <%
      //设置本页第一条帖子的ID
      begin=(pagenow1)*30+1;
      //取得从begin开始后的29条记录,返回数据集
      RS=stmt.executeQuery("select id,title,rootid,click,memo,uname,dtime,
      facepath,autoadd from bbs_t where autoadd>='"+begin+"' and 
      autoadd<='"+(begin+29)+"'");
    %>

四:这里是最关键的部分,用来发新帖子,删除帖子,修改帖子,回复帖子


    <%@page import="java.sql.*,java.util.Date"%>
    <%@page contentType="text/html;charset=gb2312"%>

    <%!
      //############### 公用变量 ###################
      String uname="";//当前用户的用户名
      String forum="";
      String flag="";
      ResultSet rs=null;
      ResultSet rs1=null;
      String i="";//帖子ID
      String r="";//根帖ID
      int id=0;
      String content="";//帖子内容
      String checkbox="";//是否自动回复
      String title="";//帖子标题

      //########### reply变量 ####################
      int ordernum=65536;//基数
      int level=0;//bbs数据库中的level字段
      int num=0;//bbs数据库中的num字段
      String space="";//保存回复帖子前面的空格
      int rootid=0;
      String title_m="";

      //################ edit变量 ########################
      //串t为数据库中的title字串,t1为要替换的title
      public String repl(String t,String t1) {
        int begin=t.indexOf("<font color=+pcolor+>");
        int end=t.indexOf("</font>");
        if(begin!=1 && end!=1)
          t=t.substring(0,begin+21)+t1+t.substring(end,t.length());
        return t;
      }
      String emote="";//保存表情
    %>

    <%
//从被提交的页面取得用户名,当前论坛ID,当前帖子ID,是否为跟帖,
  帖子标题,帖子内容,表情等值
      uname=String.valueOf(session.getValue("username")).toString();
      forum=String.valueOf(request.getParameter("forum")).toString();
      flag=String.valueOf(request.getParameter("flag")).toString();
      i=String.valueOf(request.getParameter("i")).toString();
      r=String.valueOf(request.getParameter("r")).toString();
      title=String.valueOf(request.getParameter("title")).toString();
      content=String.valueOf(request.getParameter("memo")).toString();
      emote=String.valueOf(request.getParameter("emote")).toString();
    %>

    <%
      //################## post #######################
      if(flag.equals("post") && !title.equals("")) {
        if(title!=null) {
          rs=sqlbean.execQuery("select id from bbs order by id desc");
        if(rs.next())
          //设置该新帖子的ID
          id=rs.getInt("id")+1;
        else
          id=1;
        title="<a href=viewbbs.jsp?i=+id+&r=0&forum=+forum+>
	<font color=+pcolor+>"+title+"</font></a>";
        sqlbean.execUpdate("insert into bbs values
	(0,'"+uname+"','"+title+"','"+content+"','"+id+"',0,0,0,'"
	+tools.rdate()+"','"+checkbox+"','"+forum+"','"+emote+"')");
        }
        out.println("你的帖子已经发出,请稍后...");
      }
    %>

    <%
      //###################### reply ########################
      if(flag.equals("reply") && !title.equals("")) {
        rs=sqlbean.execQuery("select uname,id,rootid,
	level,num,amail from bbs where id='"+i+"'");
        if(rs.next()) {
          rs1=sqlbean.execQuery("select iname,email from 
	  usertable where iname='"+rs.getString("uname")+"'");
        if(rs1.next())
          to=rs1.getString("email");
        level=rs.getInt("level")+1;
        num=rs.getInt("num");
        amail=rs.getString("amail");
        }
        //以下是论坛树状结构的算法,此算法在前面已经详细介绍过了,这里就不重复了
        if(rs.next()) { //没有子帖
          rootid=Integer.valueOf(i).intValue();
          num=num+ordernum;
          space="   ";
        }
        else {
          if(r.equals("0"))//回复根帖
          {
            rootid=Integer.valueOf(i).intValue();
            rs1=sqlbean.execQuery("select * from bbs where forum='"+forum+"' 
	    and rootid='"+i+"' and num>'"+num+"' order by 
	    rootid+idsign(rootid)*id desc,num");
          }
          else {
            rootid=Integer.valueOf(r).intValue();
            rs1=sqlbean.execQuery("select * from bbs where forum='"+forum+"' 
	    and rootid='"+r+"' and num>'"+num+"' order by 
	    rootid+idsign(rootid)*id desc,num");
          }
          if(rs1.next()) {
            num=(num+rs1.getInt("num"))/2;
          }
          else {
            num=num+ordernum;
          }
          space="";
          for(int j=0;j<level;j++)
            space=space+"   ";
        }

        if(i!=null) {
          title_m=String.valueOf(request.getParameter("textfield3").toString());
          title=title_m;
          content=String.valueOf(request.getParameter("textfield")).toString();
          if(title!=null) {
            rs=sqlbean.execQuery("select id from bbs order by id desc");
            if(rs.next())
              id=rs.getInt("id")+1;
            title=space+"<font color=+pcolor+>"+title+"</font>";
            //sqlbean.execUpdate("insert into bbs values(0,'"+uname+"','"
	 +title+"','"+content+"','"+id+"','"+rootid+"','"+level+"','"+num+"',
	    '"+tools.rdate()+"','"+checkbox+"','"+forum+"','"+emote+"')"); 
          }
        }
        out.println("你的帖子已经发出,请稍后...");
      }
    %>

    <%
      //################# edit #####################
      if(flag.equals("edit")) {
        rs=sqlbean.execQuery("select title from bbs where id='"+i+"'");
        if(rs.next())
          title=repl(String.valueOf(rs.getString("title")).toString(),title);
        if(title!=null) {
          sqlbean.execUpdate("update bbs set title='"+title.trim()+"',memo='"
	  +content.trim()+"',dtime='"+tools.rdate()+"',facepath='"+emote+"' 
	  where id='"+i+"' and forum='"+forum+"'");
        }
        out.println("你的帖子已经发出,请稍后...");
      }
    %>

    <%
      //################ delete ###########################
      if(flag.equals("delete")) {
        //如果删除的是跟帖子,则将下面的所有子帖全部删除
        if(r.equals("0")) {
          sqlbean.execUpdate("delete from bbs where id='"+i+"'
	  or rootid='"+i+"'");
        }
        //删除子帖,删除子帖的所有回复的帖子,其余的不变
        else {
          rs=sqlbean.execQuery("select level,num from bbs where id='"+i+"'");
          if(rs.next()) {
            level=rs.getInt("level");
            num=rs.getInt("num");
          }
          rs=sqlbean.execQuery("select level,num from bbs where rootid='"+r+"' 
	  and level<="+level+" and num>"+num+" order by 
	  rootid+idsign(rootid)*id desc,num");
          if(rs.next()) {
            sqlbean.execUpdate("delete from bbs where rootid='"+r+"'
	    and num<"+rs.getInt("num")+" and num>="+num);
          }
          else {
            rs=sqlbean.execQuery("select level,num from bbs where rootid='"+r+"'
	    and num>="+num+" order by num desc");
            if(rs.next()) {
              sqlbean.execUpdate("delete from bbs where rootid='"+r+"'
	      and num<="+rs.getInt("num")+" and num>="+num);
            }
          }
        }
        out.println("该帖已经被删除!");
      }
      %>


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:JSP 技术白皮书   下一篇:[硬盘]安装第二块硬盘

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章