0

この非常に単純な例では、ここで何が起こっているのか理解できません。

問題の概要:単純なサーブレットがありますが、ブラウザから 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;
}

編集:

  1. 結果を含む: これは、たとえば debugHtmlId 要素の innerHTML の値として表示されるものです。

    readyState='1' readyState='1' readyState='2' status='0' responseText='' | readyState='4' status='0' responseText='' |

  2. 奇妙な動作: 私の readystatechange ハンドラが再入力されていることにも注意してください! つまり、状態が変化するたびに readyState='...' status='...' responseText='...' トライアドが表示されることを期待していました...

4

4 に答える 4

1

私はこの同じ問題に取り組んでいました。これは間違いなくクロスドメインの問題であり、私の場合、javascript ファイルはサーブレットと同じサーバーであり、そうでない html ページからスクリプトをダウンロードして呼び出していました。ハリーと同じように、ローカルで html を読み込んで 0 ステータスを取得していました。

私にとっての解決策は、追加することでした

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

SERVLET コードへ - これにより、JavaScript はドメイン外からサーブレットを呼び出すことができます。サーブレットがヒットしていることを知っていたので、それは私を殺していました。サーバーデバッガーは GET を記録していましたが、応答は空で、ステータスは 0 でした。そのヘッダーをサーブレットの応答。

于 2011-12-09T19:54:34.183 に答える
1

問題は、上記の HTML を Tomcat/Web サーバーからではなく、ローカル ファイル システムからブラウザにロードしたことです。私は、開発のために HTML をサーバーにデプロイする必要はないと考えました。

私が最初に望んでいたものが今ではうまく機能しているので、ajax の同期モードで発生していた例外についてはそれほど心配していません。

于 2009-10-21T11:52:08.847 に答える