`
郭亲华
  • 浏览: 49753 次
  • 性别: 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实现的无刷新网页表单验证示例源码例子

    在这个基于纯JavaScript和Ajax实现的无刷新网页表单验证示例中,我们将深入探讨相关技术与实践。 首先,JavaScript是客户端编程的主要语言,它在用户的浏览器上运行,可以实时检查用户输入,提供即时反馈,而无需...

    Ajax实例2 改善用户体验

    这些实例覆盖了从简单的交互改进到复杂的功能增强,比如无刷新显示回帖、输入内容前的提示、带进度的文件上传、大量数据的动态浏览查询、信息排序以及标签页的切换等。 #### 二、无刷新显示回帖 **2.1 无刷新显示...

    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

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

    PHP+HTML简单实现BBS论坛与回帖1

    而`main_right`部分使用了Iframe来实现局部显示,这样可以将不同页面的内容嵌入到主页面的一个特定区域,使得页面更新时只刷新选定的部分,提高用户体验。 ```html ...

    限制重复发帖和重复回帖插件 for Discuz!7.0.rar

    3. AJAX技术:为了实现无刷新的用户体验,插件可能使用AJAX异步通信,检查帖子的重复性。 4. JavaScript和CSS:用于增强用户界面的动态效果和视觉样式。 5. Discuz! API理解:熟悉Discuz!的API接口,能够调用论坛...

    ajax 经典案例源码(Jsp)

    3. **无刷新回帖**:在论坛或社交媒体中,用户发表评论或回复时,无需刷新整个页面,新帖子能立即显示出来。Ajax在此过程中负责发送用户输入的数据到服务器,并将新产生的帖子信息返回,插入到相应位置。 4. **文件...

    回帖脱衣服的图片实现代码

    这个脚本在论坛或其他互动场景中可以用于创建有趣的动态效果,例如"回帖脱衣服的图片"可能是指随着用户交互(如回帖)图片会发生变化,比如显示新的图片层。然而,这种功能可能需要额外的逻辑来处理图片叠加或动画...

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

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

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

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

    PHP+Ajax网站开发典型实例

    在PHP和Ajax结合的网站开发中,我们常常利用这两者的特性来实现动态、无刷新的交互体验。"PHP+Ajax网站开发典型实例"这个资源集合了多种常见的应用场景,旨在帮助开发者和学生理解并掌握这两种技术的协同工作。下面...

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

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

    php案例之 php论坛系统

    此外,PHP与前端通过AJAX技术交互,实现无刷新更新,提升用户体验。 4. **表单处理**:用户在论坛上进行发帖、回帖等操作时,会填写表单提交到服务器。PHP负责接收这些数据,进行验证(如防止SQL注入),然后存入...

Global site tag (gtag.js) - Google Analytics