米兰的小铁匠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前。同步后,回调没有注册。你是返回后才注册回调,没有效果。异步时,回调注册后,才会执行请求逻辑

    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler