我的ajax请求再次出现问题。我的架构没有改变,所以我在服务器端使用Java servlet,在客户端我正在运行一个JavaScript应用程序,用firefox编程和测试。在firefox中我也安装了firebug,因为观察传入和传出的ajax请求非常舒服。但是,我的问题如下:
有时,我必须提出更多的ajax请求。如果XMLHttpRequest对象已准备好发送(如果它处于状态0或4),我总是在发送新的对象之前进行检查,然后才触发。 正常的ajax请求大约需要200到300毫秒。但有时候,我会在10或30毫秒后看到firebug中的响应,它不包含任何数据(但请求到达servlet)。但是当我转储响应时,我希望将我的servlet发送给客户端,我看到了正确的字符串。所以似乎servlet没有将它发送给客户端。我在servlet中尝试了flush()但没有改变。我已经实现了我之前的帖子(Problem with AJAX responses)的建议,我不应该创建PrintWriter对象,你可以使用res.getWriter()(HttpServletResponse res)全局(所以现在它在我的本地doPost方法)。
有人知道出了什么问题吗?
答案 0 :(得分:0)
对于快速返回的响应,http状态(200,304等)是什么?
答案 1 :(得分:0)
以下是我在JavaScript中用来触发新请求的代码:
// the XMLHttpRequest object I created in the constructor is called this.httpReqObj
// this.queryAddr is the servlet that handels the responses
if(this.httpReqObj == null || this.queryAddr == null)
{
return(false);
}
// check if XMLHttpRequest object is ready to send a new request.
if(this.getReadyState() != 0 && this.getReadyState() != 4)
{
return(false);
}
// the message queue contains strings, that should be sent to the server
if(this.msgQueue.hasNext())
{
var bundleMsg = "";
var bundleCtr = 0;
while(this.msgQueue.hasNext() && bundleCtr < DataRequester.BUNDLE_FACTOR)
{
bundleCtr ++;
bundleMsg += this.msgQueue.consume() + "&";
}
// remove last character of string
bundleMsg = bundleMsg.substring(0, bundleMsg.length - 1);
// "POST": choose the transport mechanism to the server
// "this.queryAddr": URL to which the query should be sent
// "true": communication should be asynchron
// if argument not available, assume method is true
if(typeof method == 'undefined')
{
method = true;
}
this.httpReqObj.open("POST", this.queryAddr, method);
// this function is called every time the status
// of the http request has changed. There exist five states.
// 0: not initialized
// 1: currently loading
// 2: finished loading
// 3: waiting for return
// 4: finished
if(method)
{
this.httpReqObj.onreadystatechange = createObjectCallback(obj, func);
}
// create header for POST query
this.httpReqObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
this.httpReqObj.setRequestHeader("Content-length", bundleMsg.length);
// send data to server
this.httpReqObj.send(bundleMsg);
// synchronous request
if(method == false)
{
return(this.getResponseXML());
}
}else
{
return;
}
答案 2 :(得分:0)
尝试禁用浏览器缓存以确定这些调用是否很短,因为FF使用了先前缓存的请求。
您可能还想使用类似Fiddler web调试器的东西来确保服务器端返回正确的数据,因为它在浏览器处理之前向您显示了http流量