この非常に単純な例では、ここで何が起こっているのか理解できません。
問題の概要:単純なサーブレットがありますが、ブラウザから URL を発行して手動で操作すると問題なく動作するように見えます。「まあまあ」とは、つまり、サーブレットの応答に書いたものをブラウザの HTML ページで見ることができるということです。
ただし、Ajaxコードを介してまったく同じURLを発行すると、サーブレットはリクエストを正常に処理し、応答を正常に書き出しているように見えます...しかし、Ajaxクライアントコード側で応答が表示されないだけですしたがって、ブラウザの HTML ページにもありません。
さらに、XHR リクエストを同期化すると、ブラウザのエラー コンソールに次の例外が表示されます。
エラー: キャッチされない例外: [例外... "コンポーネントがエラー コードを返しました: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.send]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" 場所: "JS フレーム :: file:///home/sd/ Desktop/test.html :: callServlet :: 行 35" データ: no]
環境:
ブラウザ: Firefox 3.5.3
サーブレット コンテナー: 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 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' status='0' responseText='' | readyState='4' status='0' responseText='' |
奇妙な動作: 私の readystatechange ハンドラが再入力されていることにも注意してください! つまり、状態が変化するたびに readyState='...' status='...' responseText='...' トライアドが表示されることを期待していました...