0

パラメータとして ID を取得し、3 つの値を返すサーブレットがあります。サーブレット コードは大きいので、必要な詳細だけを指定します。

getdetails.jsp

Inputs : ID //as a query string
Returns: ID, average, count // As a JSON string

クライアント側から、異なる ID を使用して 2 つの非同期 JavaScript リクエストを 1 つずつ (最初のリクエストの直後の 2 番目) 作成しています。サーバーからの応答は次のとおりです

For ID1 : ID1, average1, count1
For ID2 : ID1, average2, count2

ID2 の場合、正しい平均とカウントが得られますが、ID1 (最初のリクエストの ID) が返されます。

getdetails1.jsp の getdetails.jsp に同じコードを入れて、各サーブレットに各リクエストを行うと、正しい結果が得られます。

反応:

For ID1 : ID1, average1, count1
For ID2 : ID2, average2, count2

これの理由と、これを修正する方法は何ですか?

編集: getdetails.jsp のコード:

<%!
String ID;
JsonObject details = new JsonObject();  //using Google JSON Lib
%>
<%
ID=request.getParameter("id");
details.addProperty("ID",ID);
...   //accessing corresponding average and count
details.addProperty("average",average);
details.addProperty("count",count);
out.println(details);
%>
4

3 に答える 3

3

私の推測では、サーブレット インスタンス変数にリクエスト パラメータ値を割り当てている可能性があります。

サーブレットのインスタンスは 1 つだけ作成され、すべてのリクエストが同じインスタンスを共有します。これは、これらのタイプの状態の破損につながります。

于 2012-08-16T14:24:20.170 に答える
2

The number of servlet instances created by a servlet will always be one.

リクエスト パラメータをサーブレット インスタンスに割り当てた場合、この問題が発生する可能性があります。

そうでない場合は、

それを分析するために、サーブレットでの ID の実装の一部を共有します。

于 2012-08-16T14:27:18.313 に答える
1

問題は、@thinksteep が提案したことです。JSP コードは変換され、サーブレットにコンパイルされます。JSP 宣言を使用すると、<%! %>スレッドセーフではないインスタンス変数が作成されます。<%! %>セクションから変数を削除してセクションで宣言することにより、リクエストごとに変数が新しく作成されるように変数を宣言する必要があります<% %>

于 2012-08-16T15:32:10.507 に答える