米兰的小铁匠z 2020-03-20 17:32 采纳率: 25%
浏览 224

ajax的xmlhttp就绪码和响应问题

ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
    <script>
        //原生js实现ajax
        function fun() {
            //XMLHttpRequest 是 AJAX 的基础。
            //1.创建核心对象(根据不同的浏览器版本)
            var xmlhttp;
            if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            //2.建立连接
            /**
             *  参数:
             *      1.请求参数:Get,Post
             *      2.请求URL
             *      3.同步或异步,async:true(异步)或 false(同步)
             */
            xmlhttp.open("GET","ajaxServlet?username=tom",true);  //get请求参数写在请求URL的后头,xmlhttp.send();空参传递

            //3. 发送请求
            xmlhttp.send();
            //xmlhttp.send("username=tom"); 传递的是post请求所携带的参数

            //4.接收处理服务器点的响应
            //获取方式xmlhttp.responseText;当xmlhttp就绪状态发生变化时,触发onreadystatechange
            xmlhttp.onreadystatechange=function()
            {
                /**
                 (1)有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
                     * 0: 请求未初始化
                     * 1: 服务器连接已建立
                     * 2: 请求已接收
                     * 3: 请求处理中
                     * 4: 请求已完成,且响应已就绪
                 (2)xmlhttp.status
                    *200: "OK"
                    * 404: 未找到页面
                 */
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                    var responseText = xmlhttp.responseText;
                    alert(responseText);
                }
            }

        }
    </script>
</head>
<body>

<input type="button" value="发送异步请求" onclick="fun()">
<input type="text">
</body>
</html>

请求发送到ajaxServlet并携带请求参数,

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ajaxServlet")
public class AjaxServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取ajax的请求参数
        String username = request.getParameter("username");

        //处理业务逻辑
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //2.打印username
        System.out.println(username);

        //3.相应
        response.getWriter().write("hello : "+username);
    }
}

这里的问题是,ajaxServlet设置了response,为什么ajax.html的alert(responseText);在
xmlhttp.open("GET","ajaxServlet?username=tom",true); //异步
可以弹出
xmlhttp.open("GET","ajaxServlet?username=tom",false); //同步

不可以弹出,
F12都可以获取到服务器的响应信息,
  • 写回答

1条回答 默认 最新

  • UFO_SERIESOFSOFT 2020-03-21 02:36
    关注

    onreadystatechange回调要放到send前。同步后,回调没有注册。你是返回后才注册回调,没有效果。异步时,回调注册后,才会执行请求逻辑

    评论

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面