再次发出Ajax请求

时间:2009-08-27 06:54:57

标签: ajax servlets

我的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方法)。

有人知道出了什么问题吗?

3 个答案:

答案 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流量