我无法弄清楚这个超简单例子里发生了什么。Servlet --x - > Ajax:Ajax代码没有收到servlet响应
问题摘要:我有一个简单的servlet,如果我手动驱动它,通过从浏览器发布它的URL,似乎运行得很好。我的意思是:我可以在浏览器的HTML页面看到我在servlet响应中写入的任何东西。
但是,如果我通过Ajax代码发出非常相同的URL,那么servlet会很好地处理请求,甚至会'出现'写出响应罚款......但是,我没有看到任何响应在Ajax客户端代码端,因此也不在我的浏览器HTML页面。
另外,如果我做我的XHR请求syncrhonous,浏览器错误控制台显示以下异常:
错误:未捕获的异常:[异常...“组件返回故障代码:0x80004005的(NS_ERROR_FAILURE) [nsIXMLHttpRequest.send]“nsresult:”0x80004005(NS_ERROR_FAILURE)“位置:”JS frame :: file:///home/sd/Desktop/test.html :: callServlet :: line 35“data:no]
环境:
浏览器:Firefox 3.5.3
Servlet容器:Tomcat的6.0.20
操作系统: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;
}
编辑:
包括结果:这是我看到的例子是我的我的debugHtmlId元素的innerHTML值。
的readyState = '1' 的readyState = '1' 的readyState = '2' 状态= '0' 的responseText = '' | readyState ='4' status ='0' responseText =''|
奇怪的行为:还请注意我的readystatechange处理程序正在重新输入!我的意思是,我期待看到readyState ='...'status ='...'responseText ='...'每个状态变化的黑社会...
关于您遇到的异常 - 只要将同步模式用于Ajax调用,Firefox确实会发生此错误,因为发送同步请求会阻止执行并等待回复,从而导致用户界面无法响应。所以实际上,对于同步Ajax请求没有任何有意义的用例场景。但是,其他浏览器如IE/Chrome /等。允许这种行为而不会引发错误。 – Vuk 2010-01-17 22:20:45