2009-08-19 26 views
0

私は以下の問題があります。私は、Javaサーブレットをプログラミングしました。これは、javascriptアプリケーションからのajaxリクエストに応答します。 Javaサーブレットからの応答はxmlエンコードされたメッセージです。通常はすべてうまく動作しますが、Ajaxが必要とする(あまりにも多くの)Ajaxを送信すると、1つのAjax応答内にさらに多くの応答があり、結果として「root文書の後の迷惑メール」というエラーメッセージが表示されます。 例:AJAXの応答の問題

<root> 
<node1></node1> 
</root> 

<root> 
<node1></node1> 
</root> 

これは許可されていません(1回のメッセージで2回<root>)。なぜこれが起こるのですか?私はいつも各Ajax呼び出しのために、新しいサーブレットインスタンスが開始されると考えました。それは間違っていますか?

答えて

0

"writer"という名前のPrintWriterメンバー変数が問題になりました。 Tomcat(または他のサーブレットコンテナ)は、1つのインスタンスハンドルが1つ以上のリクエストを同時に処理することがあります。これはサーブレットプログラミングの問題の一般的な原因です。

ここでTomcatが(それが簡単に問題を引き起こす可能性にもかかわらず、有効とサーブレットに期待ある)やっているかもしれないもののいくつかの擬似コードです:

Servlet servlet = new ServletTest(); 

// in thread 1: 
servlet.doPost(request1, response1); 

// in thread 2: 
servlet.doPost(request2, response2); 

のでrequest1とrequest2の両方が実行される可能性があります同時に、ライター変数を共有します。 request1がライターを設定すると、request2がライターを設定し、次にrequest1がXMLを書き込み、次にrequest2がXMLを書き込むと、質問に表示される出力が得られます。

+0

ありがとう、私はそれを試し、私の結果を報告します –

+0

今それは動作します、ありがとう –

1

サーブレットインスタンスはコンテナによって管理されており、受信するajax呼び出しを管理するインスタンスは想定できません。したがって、インスタンス変数を使用している場合は、問題が発生する可能性があります。したがって、1つのサーブレット・インスタンスが1つのリクエストのみを管理していると仮定することはできません。

サーブレットコードを投稿できる場合は、正確なエラーを検索することができます。