2 cyoeki cyoeki 于 2016.09.22 13:26 提问

ajax的xmlhttp.readystate一直等于2
 window.onload = function(){
        var xmlHttp = createXMLHttpRequest();
        xmlHttp.open("GET","<c:url value='/ProvinceServlet'/>",true);
        xmlHttp.send(null);
        xmlHttp.onreadystatechange = function(){
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                var text = xmlHttp.responseText;
                var proArray = eval("("+text+")");
                //document.write(xmlHttp.readyState);
                //document.write(xmlHttp.status == 200);
                for(var i=0;i<proArray.length;i++){
                    var pro = proArray[i];
                    var option = document.createElement("option");
                    option.value = pro.pid;
                    var node = document.createTextNode(pro.name);
                    option.appendChild(node);
                    document.getElementById("p").appendChild(option);
                }
            }else {
                document.write(xmlHttp.readyState==4);
                document.write(xmlHttp.status == 200);
            }
        };
    };

xmlHttp.status == 200 输出是true,但是xmlHttp.readyState==4输出是false。

以下是servlet的代码:

 public class ProvinceServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        Dao dao = new Dao();
        List<Province> listProvinces = dao.findAllProvince();
        String jsonProvince = JSONArray.fromObject(listProvinces).toString();
        response.getWriter().print(jsonProvince);
    }

}

5个回答

showbo
showbo   Ds   Rxr 2016.09.22 13:44
已采纳

应该是ie下缓存了,加时间戳防止缓存

  xmlHttp.open("GET","<c:url value='/ProvinceServlet'/>?_"+new Date().getTime(),true);

ajax状态

cyoeki
cyoeki 回复showbo: 幡然醒悟!谢谢前辈!!
大约一年之前 回复
showbo
showbo 回复cyoeki: 知道了。。你调用了 document.write(xmlHttp.readyState==4);,文档流关闭调用这个会覆盖当前页面内容的,导致ajax后续都被释放了,只能执行一次,改为alert
大约一年之前 回复
cyoeki
cyoeki 但是现在解析不到数据,怎么办?
大约一年之前 回复
showbo
showbo 回复cyoeki: 状态2以后status就200了啊。。不是要4了才是200。2就已经加载完毕了。3是解析,4是全部解析完毕,看链接里面的说明
大约一年之前 回复
cyoeki
cyoeki 前辈,还是不知道问题在哪啊?
大约一年之前 回复
cyoeki
cyoeki 还是不行啊
大约一年之前 回复
Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.22 13:33

感觉是服务器端数据处理的原因。

cyoeki
cyoeki 回复Marksinoberg: 没问题的,项目名之类的都正确的
大约一年之前 回复
Marksinoberg
Marksinoberg 回复Marksinoberg: 写错了吧。
大约一年之前 回复
Marksinoberg
Marksinoberg 回复cyoeki: "<c:url value='/ProvinceServlet'/>", 试试这个,看看网页源码上显示的地址正确不?
大约一年之前 回复
cyoeki
cyoeki 而且单独访问servlet的话是可以得到数据的
大约一年之前 回复
Marksinoberg
Marksinoberg 回复cyoeki: 对服务器端的这个借口进行一下测试,看看是否能够返回预期的数据。就知道问题所在了。
大约一年之前 回复
cyoeki
cyoeki 感觉应该是服务器端的问题,但是怎么解决啊?
大约一年之前 回复
Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.22 13:54

网页源码

我意思是从这里面看那个ajax的url地址是什么。

cyoeki
cyoeki 截图是这个样子的:
大约一年之前 回复
cyoeki
cyoeki   2016.09.22 13:54

图片说明

Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.22 13:59
 0 - (未初始化)还没有调用send()方法 
1 - (载入)已调用send()方法,正在发送请求 
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容 
3 - (交互)正在解析响应内容 
4 - (完成)响应内容解析完成,可以在客户端调用了 

对症下药吧。

cyoeki
cyoeki 回复Marksinoberg: 如果是那样的话不就访问不到servlet了么?
大约一年之前 回复
Marksinoberg
Marksinoberg 回复cyoeki: 应该是没有按照你的web.xml中的配置来写吧
大约一年之前 回复
Marksinoberg
Marksinoberg 回复cyoeki: http://blog.csdn.net/Marksinoberg/article/details/52141448?locationNum=2
大约一年之前 回复
cyoeki
cyoeki 这几个状态倒是清楚,但是还是不知道问题出在哪……
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!