`
郭亲华
  • 浏览: 48178 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

无刷新显示回帖

    博客分类:
  • Ajax
阅读更多
在留言板,论坛或贴吧等用户交流系统中,回帖是最常用的操作之一.传统的回帖操作会将用户编写的内容提交到服务器,返回一个提示信息,然后页面自动跳转回发帖主题.这个周期往往要让用户等待几秒到十几秒的时间,同时还要看着浏览器刷新1~2次.使用ajax修改后的回帖功能能不刷新页面

测试环境:eclipse3.2+jdk1.5+mysql

(希望朋友看代码时,能结合上一篇文件中的图示效果来看,就很好理解了)

用户操作界面文件index.jsp


<script type="text/javascript" src="bbs.js"></script>
<link href="bbs.css" type="text/css" rel="stylesheet">

<h1>无刷新显示回帖</h1>
<div id="statusDiv" style="display:none"></div>
<div id="thread">
<%
    String sql = "select * from bbs_post where threadid = 1 order by id asc";   //定义查询数据库的SQL语句
    Connection conn = null;                 //声明Connection对象
    PreparedStatement pstmt = null;         //声明PreparedStatement对象
    ResultSet rs = null;                    //声明ResultSet对象
    try {
        conn = DBUtils.getConnection();     //获取数据库连接
        pstmt = conn.prepareStatement(sql); //根据sql创建PreparedStatement
        rs = pstmt.executeQuery();          //执行查询,返回结果集
        while (rs.next()) {
            %>
            <div class="post" id="post<%=rs.getString("id")%>">
                <div class="post_title"><%=rs.getString("title")%> [<%=rs.getString("username")%>]</div>
                <div class="post_content"><pre><%=rs.getString("content")%></pre></div>
            </div>
            <%
        }
    } catch (SQLException e) {
        System.out.println(e.toString());
    } finally {
        DBUtils.close(rs);                  //关闭结果集
        DBUtils.close(pstmt);               //关闭PreparedStatement
        DBUtils.close(conn);                //关闭连接
    }
%>
</div>

<table class="reply">
<tr>
    <td colspan="2" class="title">回帖<input type="hidden" name="threadid" id="threadid" value="1"></td>
</tr>
<tr>
    <td>姓名:</td>
    <td><input type="text" name="username" id="username"></td>
</tr>
<tr>
    <td>标题:</td>
    <td><input type="text" name="post_title" id="post_title"></td>
</tr>
<tr>
    <td>内容:</td>
    <td><textarea name="post_content" id="post_content"></textarea></td>
</tr>
<tr>
    <td colspan="2"><input type="button" onclick="submitPost()" value="提交"></td>
</tr>
</table>


服务器端响应文件bbs_post.jsp

<%
    out.clear();                                        //清空当前的输出内容(空格和换行符)
    request.setCharacterEncoding("UTF-8");              //设置请求字符集为UTF-8

    String title = request.getParameter("title");       //获取title
    String content = request.getParameter("content");   //获取content
    String userName = request.getParameter("username"); //获取username
    String threadId = request.getParameter("threadid"); //获取threadid

    String sql = "insert into bbs_post(title,content,username,threadid) values (?,?,?,?)";   //定义查询数据库的SQL语句
    Connection conn = null;                 //声明Connection对象
    PreparedStatement pstmt = null;         //声明PreparedStatement对象
    ResultSet rs = null;                    //声明ResultSet对象
    try {
        conn = DBUtils.getConnection();     //获取数据库连接
        pstmt = conn.prepareStatement(sql); //根据sql创建PreparedStatement
        pstmt.setString(1, title);          //设置title
        pstmt.setString(2, content);        //设置content
        pstmt.setString(3, userName);       //设置userName
        pstmt.setString(4, threadId);       //设置threadId
        pstmt.executeUpdate();              //执行insert操作
        pstmt.close();

        //获取刚插入数据的新id
        pstmt = conn.prepareStatement("select last_insert_id()");
        rs = pstmt.executeQuery();
        if (rs.next()) {
            out.print(rs.getString(1));     //输出新id
        }
    } catch (SQLException e) {
        System.out.println(e.toString());
    } finally {
        DBUtils.close(rs);                  //关闭结果集
        DBUtils.close(pstmt);               //关闭PreparedStatement
        DBUtils.close(conn);                //关闭连接
    }
%>



javascript文件bbs.js

var xmlHttp;                        //用于保存XMLHttpRequest对象的全局变量
var username;                       //用于保存姓名
var title;                          //用于保存标题
var content;                        //用于保存内容
var threadid;                       //用于保存主题编号

//用于创建XMLHttpRequest对象
function createXmlHttp() {
    //根据window.XMLHttpRequest对象是否存在使用不同的创建方式
    if (window.XMLHttpRequest) {
       xmlHttp = new XMLHttpRequest();                  //FireFox、Opera等浏览器支持的创建方式
    } else {
       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
    }
}

//提交回帖到服务器
function submitPost() {
    //获取帖子中姓名、标题、内容、主题编号四部分信息
    username = document.getElementById("username").value;
    title = document.getElementById("post_title").value;
    content = document.getElementById("post_content").value;
    threadid = document.getElementById("threadid").value;

    if (checkForm()) {
        displayStatus("正在提交……");                      //显示提示信息

        createXmlHttp();                                    //创建XMLHttpRequest对象
        xmlHttp.onreadystatechange = submitPostCallBack;    //设置回调函数
        xmlHttp.open("POST", "bbs_post.jsp", true);         //发送POST请求
        //设置POST请求体类型
        xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlHttp.send("username=" + encodeURI(username) +
                     "&title=" + encodeURI(title) +
                     "&content=" + encodeURI(content) +
                     "&threadid=" + threadid);              //发送包含四个参数的请求体
    }
}

//检查表单是否内容已填写完毕
function checkForm() {
    if (username == "") {
        alert("请填写姓名");
        return false;
    } else if (title == "") {
        alert("请填写标题");
        return false;
    } else if (content == "") {
        alert("请填写内容");
        return false;
    }
    return true;
}

//获取查询选项的回调函数
function submitPostCallBack() {
    if (xmlHttp.readyState == 4) {
        createNewPost(xmlHttp.responseText);
        hiddenStatus();
    }
}

//创建新的回帖
function createNewPost(postId) {
    //清空当前表单中各部分信息
    document.getElementById("post_title").value = "";
    document.getElementById("post_content").value = "";
    document.getElementById("username").value = "";

    var postDiv = createDiv("post", "");    //创建回帖的外层div
    postDiv.id = "post" + postId;           //给新div赋id值

    var postTitleDiv = createDiv("post_title", title + " [" + username + "]");  //创建标题div
    var postContentDiv = createDiv("post_content", "<pre>" + content + "</pre>");    //创建内容div
    postDiv.appendChild(postTitleDiv);                          //在外层div追加标题
    postDiv.appendChild(postContentDiv);                        //在外层div追加内容

    document.getElementById("thread").appendChild(postDiv);     //将外层div追加到主题div中
}

//根据className和text创建新的div
function createDiv(className, text) {
    var newDiv = document.createElement("div");
    newDiv.className = className;
    newDiv.innerHTML = text;
    return newDiv;
}

//显示提示信息div
function displayStatus(info) {
    var statusDiv = document.getElementById("statusDiv");
    statusDiv.innerHTML = info;
    statusDiv.style.display = "";
}

//隐藏提示信息div
function hiddenStatus() {
    var statusDiv = document.getElementById("statusDiv");
    statusDiv.innerHTML = "";
    statusDiv.style.display = "none";
}



样式表文件bbs.css




body, td, input, textarea {
    font-family:Arial;
    font-size:12px;
}


#thread {
    border:1px solid black;
    width:300px;
    margin-bottom:10px;
}


#statusDiv {
    border:1px solid #999;
    background:#FFFFCC;
    width:100px;
    position:absolute;
    top:50%;
    left:50%;
    margin:-50px 0 0 -100px;
    width:280px;
}


div.post {
    border-bottom:1px solid black;
    padding:5px;
}


div.post_title {
    border-bottom:1px dotted #0066CC;
    font-weight:bold;
}


div.post_content {
    font-size:12px;
    margin:5px;
}


table.reply {
    border-collapse:collapse;
    width:300px;
}


table.reply td {
    border:1px solid black;
    padding:3px;
}


table.reply td.title {
    background:#003366;
    color:#FFFFFF;
}


input, textarea {
    border:1px solid black;
}


textarea {
    width:200px;
    height:50px;
}


pre {
    margin:0;
}

分享到:
评论

相关推荐

    基于纯js+Ajax实现的无刷新网页表单验证示例源码例子

    基于纯js+Ajax实现的无刷新网页表单验证示例源码例子

    JSP Ajax经典实例大全源代码.rar

     2.1无刷新显示回帖  2.2输入内容前提示  2.3带进度的文件上传  2.4大量数据动态浏览查询  2.5信息排序  2.6切换标签页  第三章 电子商务应用  3.1注册表单验证  3.2购物车  3.3产品快速检索  3.4系列...

    ajax经典实例大全

    2.1无刷新显示回帖 2.2输入内容前提示 2.3带进度的文件上传 2.4大量数据动态浏览查询 2.5信息排序 2.6切换标签页 第三章 电子商务应用 3.1注册表单验证 3.2购物车 3.3产品快速检索 3.4系列产品特性速查 ...

    Ajax无刷新在线查词

    内容索引:脚本资源,HTML,无刷新提交,AJAX AJAX无刷新在线查词,输入中文或英文,直接响应翻译结果,不刷新页面,方便快捷,带有音标注释及例句(部分单词无),用了jQuery的Ajax相关函数实现,同时兼容IE6,7,8,FF,...

    Ajax 经典案例开发大全

    2-1.EXE 无刷新显示回帖实例演示 2-2.EXE 输入内容前提示实例演示 2-3.EXE 带进度的文件上传实例演示 2-4.EXE 大量数据动态浏览查询实例演示 2-5.EXE 信息排序实例演示 2-6.EXE 切换标签页实例演示 3-1.EXE 注册表单...

    Ajax 实例

    2.EXE 根据邮政编码获取地区信息实例演示 1-3.EXE 动态树形列表实例演示 1-4.EXE 多级联动菜单实例演示 1-5.EXE 条件设置向导实例演示 1-6.EXE 页面关键词提示实例演示 2-1.EXE 无刷新显示回帖实例...

    ajax实例大全 很实用的!

    &lt;tr&gt;&lt;td&gt;&lt;a href="2.1/index.jsp"&gt;2.1无刷新显示回帖&lt;/a&gt;&lt;/td&gt; &lt;tr&gt;&lt;td&gt;&lt;a href="2.2/suggest.html"&gt;2.2输入内容前提示&lt;/a&gt;&lt;/td&gt; &lt;tr&gt;&lt;td&gt;&lt;a href="2.3/upload.html"&gt;2.3带进度的文件上传&lt;/a&gt;&lt;/td&gt; &lt;tr&gt;&lt;td&gt;...

    AJAX实用案例(动态加载 改善体验)

    动态加载数据动态加载的(FAQ 根据邮政编码获取地区信息、动态树形列表、多级联动菜单、 条件设置...改善客户体验(无刷新显示回帖、输入内容前提示、带进度的文件上传、大量数据动态浏览查询、信息排序、切换标签页)

    吾爱破解-自动刷帖、自动回帖脚本1.2.1.rar

    进入论坛后选择【精品软件】,然后脚本将自动启动刷帖功能,随机在40到300秒范围自动打开设刷新并自动回帖,吾爱破解论坛自动刷帖脚本,目前刷帖范围为精品软件、逆向资源和原创作品,回帖内容以感谢楼主为主要内容...

    百度贴吧手机模板 收费版1.0

    列表页标题 标题+内容 多图显示 视频缩略图显示视频点击播放/列表页三种模式无刷新切换/列表页无刷新加载/支持主题分类筛选 回帖提醒/楼中楼/支持验证码/回帖表情/签名/相关主题/发帖支持标签/发帖支持投票悬赏等...

    ajax 经典案例源码(Jsp)

    包括了:多级联动菜单,动态树形列表,无刷新回帖,文件上传进度条显示,大量数据动态查询,购物车,聊天室,灯箱效果,自动保存草稿,考试系统等等50多中效果源码

    深博贴吧(仿百度)双数据库版 v1.5

    10、发帖和回帖后自动返回相应的帖子(原来并无返回,很不方便) 11、主题调用时增加了显示发帖者,非会员发帖将显示为“游客” v1.5更新: 1、修复了后台更改不了用户密码的BUG 2、修复了db1未定义变量的问题 ...

    深博贴吧双数据库版 v1.0

    修改自琪琪贴吧程序 v3.3,增加了以下功能: 1、可以支持ACCESS或者MSSQL数据库,只...10、发帖和回帖后自动返回相应的帖子(原来并无返回,很不方便) 11、主题调用时增加了显示发帖者,非会员发帖将显示为“游客”

    深博贴吧(仿百度)双数据库版 v2.0

    10、发帖和回帖后自动返回相应的帖子(原来并无返回,很不方便) 11、主题调用时增加了显示发帖者,非会员发帖将显示为“游客” v2.0更新: 1、贴吧列表显示相关贴吧简介 2、锁定贴吧后有相关的提示 3、限制了...

    蝉知企业门户系统 8.3

    蝉知企业门户系统是一款开源免费的企业门户系统,专为企业营销设计! 蝉知企业门户系统 8.3 更新日志:2020-06-19 功能更新:微信小程序新增会员功能...修复前台订单列表留言后没有刷新的问题;修复其他已知问题。

    AppCan-BBS v2.2 for Discuz!X2 和 Discuz!X2.5.rar

    2. 通过手机客户端,网站用户不仅可以浏览帖子、发帖、回帖、收发站内信等基本的社区操作;还能体验新闻快报及社区互动,更能享受拍照上传、定位交友、微博共享等移动专属服务。 1. 网站可以享受自定义桌面图标、...

    梦想互动社区 Ver4.0 For Dvbbs7.1 美化修改版

    增加个人文集,个人精华 验证码自动填写 增加了新概念跳楼、版面跳页 增加美化提示框 垂直滚动公告 论坛右下角短信无刷新弹出 帖子中滚动条改变字体大小 不填签名时让默认写上论坛信息...

    KQJBBS (娱乐先锋论坛) V3.1

    (42)可以设置同一个 IP 的机器的刷新频度,以防止用户恶意刷屏。 (43)可以限制同一个 IP 的机器注册时间间隔,以防止用户恶意注册会员。 (44)可以设置是否允许上传附件 (45)可以设置是否...

    KesionEshop v8.05 Build 20120619 UTF-8

    4、修复推送到论坛的文章,在文章内容页显示不了回帖内容 5、修复后台搜索标签,部分sql版本用户提示443行出错。 6、修复商城系统退出邮件发送错了。发的是付款的提示邮件 7、修复文章内容页如果启用内容关键字,...

    KesionEshop v8.05 Build 20120619 GBK

    4、修复推送到论坛的文章,在文章内容页显示不了回帖内容 5、修复后台搜索标签,部分sql版本用户提示443行出错。 6、修复商城系统退出邮件发送错了。发的是付款的提示邮件 7、修复文章内容页如果启用内容关键字,...

Global site tag (gtag.js) - Google Analytics