关于 XMLHttpRequest对象的onreadyStateChange方法

最近做了一个Ajax的demo,前台用HTML+javascript,后台用一个servlet来响应,流程如下:

页面点击链接事件,由js捕获,生成一个请求到后台,servlet处理后给出响应信息,并显示在页面上。

 

问题是,页面无法获取到servlet的响应信息。

 

初始代码

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Test H2</title>
    <style>
        #result{
            position:absolute;
            left:50px;
            top:300px;
        }
    </style>
    <!-- <script type="text/javascript" src="js/jquery-1.11.1.js"></script> -->
    <script>
        function handle(url){
            // Fetch the data, HERE i just give some dummy data
            var username = "joshua";
            var query = "query_test";
            var feature = url;
            var click_type = "clc_test";
            var rank = 1;
            var page_number = 1;
            var paras = "?query="+query+"&username="+username+"&feature="+feature+
                        "&click_type="+click_type+"&rank="+rank+"&page_number="+page_number;
            // transfer this data to servlet to save
            var xmlhttp;
            // code for IE7+, Firefox, Chrome, Opera, Safari
            if(window.XMLHttpRequest){
                xmlhttp = new XMLHttpRequest;
            // code for IE6, IE5
            }else{
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("POST","/WebDemo_H2/AjaxServlet"+paras+"&tip="+Math.random(),true);
            xmlhttp.send();
        document.getElementById("result").innerHTML = xmlhttp.responseText;
        }
    </script>
</head>
<body>
    <aside style="margin:10px;">
        <div>
            <p style="font-weight:bold;">Main Testing Page</p>
            <a href="index.html">Back</a>
        </div>
        <div style="height:20px"></div>
        <div>
            <a href="javascript:handle('test1.html')">test link 1</a><br/>
            <a href="javascript:handle('test2.html')">test link 2</a><br/>
            <a href="javascript:handle('test3.html')">test link 3</a>
        </div>
    </aside>
    <button onclick="">Clear Data</button>
    <div id="result">
    </div>
</body>
</html>

Servlet:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AjaxServlet extends HttpServlet {

    public Connection conn = null;

    public void init() {
        try {
            Class.forName("org.h2.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:h2:C:/Users/zhoum18/H2Test/db/test", "sa", "");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            request.setCharacterEncoding("GBK");
            response.setContentType("text/html;charset=GBK");
        // get the parameters
        try {
            PrintWriter out = response.getWriter();
            String userName = request.getParameter("username");
            String query = request.getParameter("query");
            String feature = request.getParameter("feature");
            String click_type = request.getParameter("click_type");
            String rank = request.getParameter("rank");
            String page_number = request.getParameter("page_number");
            String sql = "INSERT INTO CLICK_TRACKING SELECT ?,?,?,?,?,?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, query);
            pstmt.setString(2, userName);
            pstmt.setString(3, feature);
            pstmt.setString(4, click_type);
            pstmt.setInt(5, Integer.parseInt(rank));
            pstmt.setInt(6, Integer.parseInt(page_number));
            pstmt.executeUpdate();
            conn.commit();

            sql = "select feature,count(*) as num  from click_tracking group by feature";
            pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            out.println("<table border='1'>");
            out.println("<tr>");
            out.println("<td>Link</td>");
            out.println("<td>Click Times</td>");
            out.println("</tr>");
            while (rs.next()) {
                out.println("<tr>");
                out.println("<td>" + rs.getString("feature") + "</td>");
                out.println("<td>" + rs.getString("num") + "</td>");
                out.println("</tr>");
            }
            out.println("</table>");
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void destroy() {
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
            }
        }
    }
}

可以看到在servlet中用PrintWriter对象返回了建立table的HTML语句,按照逻辑,应该在页面上打印出table的内容跟应有的值;

结果是,xmlhttp.responseText方法返回的值始终为空,没有任何值返回,用chrome浏览器调试,发现HTTP请求是有响应的,而且response tab里面有值:

 

 

经过代码查看,发现xmlhttp对象的readystate始终为1.

修改了下页面js的代码,将原有的写入改成了以下代码:

            xmlhttp.open("POST","/WebDemo_H2/AjaxServlet"+paras+"&tip="+Math.random(),true);
            xmlhttp.onreadystatechange = function(){
                if (xmlhttp.readyState == 4) {
                    document.getElementById("result").innerHTML = xmlhttp.responseText;
                }
            }
            xmlhttp.send();

成功显示出response的内容。

 

结论:

页面发送出请求后,往往无法得知什么时候才能完成这个请求并获得回应,所以要使用一个事件机制来捕获请求完成的状态。

XmlHttpRequest对象有一个方法,onreadystatechange这个函数实现这一个功能。

类似于回调函数,在readystate改变时,这个方法可以指定一个函数来判断和处理,比如上面的代码:

xmlhttp.onreadystatechange = function(){

  // 这里面的就是当readystate改变时,处理事件的代码,在我的例子中,判断了当readyState等于4的时候,再捕获相应的信息。

}

 

readyState的不同值,代表了不同的状态:

0:尚未初始化
1:正在加载
2:加载完毕
3:正在处理
4:处理完毕

当其变为4, 就可以访问从服务器返回的数据了。

另附http请求相应代码

200 请求成功
202 请求被接受但处理未完成
400 错误请求
404 请求资源未找到
500 内部服务器错误

 

转载于:https://www.cnblogs.com/ChewApple/p/3829124.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: XMLHttpRequest对象是一种能够发送HTTP或HTTPS请求并接收服务器响应的JavaScript API。它可以用于创建异步的Web应用程序,不需要刷新页面就可以更新内容。这个对象通常被用于AJAX编程中,但它也可以用于其它的网络通信。 ### 回答2: XMLHttpRequest对象是一种在JavaScript中使用的原生对象,它允许在客户端和服务器之间进行异步数据交换。通过使用XMLHttpRequest对象,我们可以向服务器发送HTTP请求,并在不刷新整个页面的情况下获取服务器的响应数据。 XMLHttpRequest对象最主要的功能是通过HTTP协议向服务器发送请求,以下是实现HTTP请求的几个基本步骤: 1. 创建一个XMLHttpRequest对象:使用`new XMLHttpRequest()`来创建一个XMLHttpRequest对象。 2. 设置请求的方法和地址:使用`open()`方法来设置HTTP请求的方法(如GET、POST等)和请求的地址。 3. 设置请求头部信息:可以通过`setRequestHeader()`方法来设置HTTP请求的头部信息,例如设置Content-Type等。 4. 发送请求:使用`send()`方法来发送HTTP请求,如果是POST请求,可以在send()中传递请求的参数。 5. 监听响应:通过设置`onreadystatechange`属性,并使用`onreadystatechange`事件来监听请求的状态变化。 6. 获取响应数据:可以使用`responseText`属性来获取服务器响应的文本数据,使用`responseXML`属性获取服务器响应的XML数据,以及其他相关属性。 XMLHttpRequest对象的出现使得客户端和服务器之间的数据交换更加灵活和高效。它可以用于获取服务器返回的数据,并以各种形式展示在网页中,例如动态更新页面内容、实现无刷新提交表单、实时获取服务器数据等。同时,XMLHttpRequest对象也被广泛用于实现Ajax技术,实现异步更新页面的效果。 需要注意的是,由于浏览器的安全限制,XMLHttpRequest对象只能用于请求同源策略下的资源。如果需要请求其他域名下的资源,可以使用CORS(跨域资源共享)或者代理方式来解决。此外,XMLHttpRequest对象也有一些局限性,例如无法同时发送多个请求、无法监听请求进度等。因此,在一些复杂的应用场景下,可能需要使用其他技术来完成数据交换的需求。 ### 回答3: XMLHttpRequest对象是一种在前端开发中用于与服务器进行通信的API。它是浏览器提供的用于发送和接收HTTP请求的对象之一。 XMLHttpRequest对象的使用主要分为几个步骤。首先,我们需要创建一个XMLHttpRequest对象,可以通过调用`new XMLHttpRequest()`来实现。然后,可以使用`open()`方法来指定发送请求的方式(GET、POST等)、URL地址以及是否采用异步方式发送请求。接下来,使用`send()`方法将请求发送到服务器。 在请求发送完成后,XMLHttpRequest对象将会接收服务器的响应。我们可以通过`onreadystatechange`事件来监听ReadyState状态的变化,并在状态为4(请求已完成)时处理服务器的响应。此时,可以使用`status`属性来获取服务器返回的状态码,通过`responseText`或`responseXML`属性获取服务器返回的数据。 XMLHttpRequest对象是一个功能强大且广泛使用的技术,可以用于实现各种与服务器交互的功能。例如,可以使用该对象发送Ajax请求,实现页面的无刷新更新。同时,也可以使用它来实现登录验证、数据传输、文件上传等功能。此外,XMLHttpRequest对象支持跨域请求,可以实现访问不同域名下的资源。 总之,XMLHttpRequest对象是前端开发中不可或缺的一部分,它使得我们可以通过JavaScript与服务器进行通信,实现更加丰富和动态的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值