Servlet --x - > Ajax:Ajax代码没有收到servlet响应

时间:2009-10-12 11:52:11

标签: ajax servlets xmlhttprequest responsetext

在这个超简单的例子中,我无法弄清楚这里发生了什么。

问题摘要:我有一个简单的servlet,如果我手动驱动它似乎运行得很好...通过从浏览器发出它的URL。 “很好”我的意思是:我可以在浏览器HTML页面中看到我在servlet响应中写的任何内容。

然而,如果我通过Ajax代码发出相同的URL,servlet处理请求很好,甚至“看起来”写出响应很好......但是,就是我做的没有在Ajax客户端代码端看到任何响应,因此也没有在我的浏览器HTML页面中看到任何响应。

进一步,如果我使我的XHR请求同步,浏览器错误控制台会显示以下异常:

错误:未捕获的异常:[Exception ...“组件返回失败代码:0x80004005(NS_ERROR_FAILURE)[nsIXMLHttpRequest.send]”nsresult:“0x80004005(NS_ERROR_FAILURE)”location:“JS frame :: file:/ //home/sd/Desktop/test.html :: callServlet :: line 35“data:no]

环境:

浏览器:Firefox 3.5.3

Servlet容器:Tomcat 6.0.20

OS:Linux / Fedora 11

Ajax代码:

<!-- test.html -->
<html>
<head>
  <script>
var req;

function $(id) {
  return document.getElementById(id);
}

function servletCallback() {
  var field = $("debugHtmlId");
  field.innerHTML += "readyState='" + req.readyState + "'<br> ";
  field.innerHTML += "status='" + req.status + "'<br> ";
  field.innerHTML += "responseText='" + req.responseText + "' | <br> ";
}

req = new XMLHttpRequest();
req.onreadystatechange = servletCallback;

    function callServlet() {
      // With async mode off, I get the
      // Exception listed above.
      //    req.open("GET", "http://localhost:8080/aaa/bbb?f=test", false);

      req.open("GET", "http://localhost:8080/aaa/bbb?f=test", true);
      req.send(null);

    }
  </script>
</head>
<body>    
  <input id="callserv" type="submit" value="Call Servlet" onclick="callServlet();" />
  <span id="debugHtmlId"></div>
</body>
</html>

Servlet代码:

// servlet code
public class MyServlet extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse rsp)
      throws ServletException, IOException {

    rsp.setContentType("text/html");

    String val = req.getParameter("f");
    if(val.equals("test")) {
      // Increment value.
      ++_count;

      // Return value.
      PrintWriter out = rsp.getWriter();
      out.printf("%d\n", _count);
      out.close();

      // This shows up fine in servlet log.
      System.out.printf("%d\n", _count);
    }
  }

  // This variable is incremented and returned on each call to doGet().
  private int _count = 0;
}

修改

  1. 包括结果:这是我所看到的例如我的debugHtmlId元素的innerHTML的值。

    的readyState = '1' 的readyState = '1' readyState的= '2' 状态= '0' responseText =''| 的readyState = '4' 状态= '0' responseText =''|

  2. 奇怪的行为:另请注意,我的readystatechange处理程序正在重新输入!我的意思是,我期待看到readyState ='...'status ='...'responseText ='...'三重奏为每个州的变化......

4 个答案:

答案 0 :(得分:1)

问题是: 我在浏览器中加载了上述HTML,而不是从Tomcat / Web服务器加载,而是从我的本地文件系统加载。我想,对于开发,我不需要将HTML部署到服务器。

由于我原本想要的工作现在很好,我现在并不担心我在ajax的同步模式下遇到的异常。

答案 1 :(得分:1)

我正在解决同样的问题。这肯定是一个跨域问题,在我的情况下,javascript文件是与servlet相同的服务器,我正在下载并从一个不是的html页面调用脚本。就像Harry我在本地加载html并获得0状态。

我的解决方案是添加

resp.addHeader(“Access-Control-Allow-Origin”,“*”);

到SERVLET代码 - 这允许javascript从域外调用servlet。它杀了我,因为我知道servlet被击中,服务器调试器正在记录GET - 但是响应是空的并且状态为0.如果你将该标题添加到该问题,那么问题上的所有代码都可以正常工作servlet响应。

答案 2 :(得分:0)

试试这个:不要在out.close();上致电PrintWriter。相反,请致电out.flush();

答案 3 :(得分:0)

我查看代码并在Tomcat5的CentOS 5 Linux开发盒上做了两件事:

  1. 修改代码并将我的servlet重命名为eServlet:

    req.open("GET", "http://localhost:8080/aaa/bbb?f=test", true);
    

    req.open("GET", "eServelet?f=test", true);
    
  2. 修改了WEB-INF / web.xml并添加了servlet映射

    <servlet>
        <servlet-name>eServletApps</servlet-name>
        <servlet-class>eServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>eServletApps</servlet-name>
        <url-pattern>/eServlet</url-pattern>
    </servlet-mapping>
    
  3. 使用命令编译:

    # javac -classpath $CATALINA_HOME/common/lib/servlet-api.jar eServlet.java
    
  4. 加载它并且没有任何问题