我無法弄清楚這個超簡單例子裏發生了什麼。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