-3
  HttpServletRequest request;
  HttpServletResponse response;

  public void doGet(HttpServletRequest request , HttpServlet response){
         this.request = request;
         this.response = response;
  }

このサーブレットが一度に複数のリクエストを受け取るとどうなりますか?

応答の不一致の問題に直面しました。これは問題ですか?

4

6 に答える 6

4

Web アプリケーション コンテナは、サーブレットのインスタンスを 1 つだけロードします。

スレッドセーフなサーブレットを作成するには、インスタンス変数をまったく使用しないでください。リクエストとレスポンスをインスタンス変数として設定するのは、まったく間違っています。サーブレットのインスタンスは単一のリクエストに属していません。

リクエストまたはレスポンスの要素を他のメソッドで使用できるようにする必要がある場合は、それらのメソッドに渡します。インスタンス変数としては必要ありません。

于 2012-05-19T12:38:46.537 に答える
2

もちろん、それは問題です。サーブレットはシングルトンです。このサーブレットへのすべての要求を処理するために、同じサーブレット インスタンスが使用されます。もちろん、リクエストは同時に処理されます。これは、スレッド 1 が通常スレッド 2 によって処理される要求と応答を使用することを意味します。

于 2012-05-19T12:37:16.510 に答える
1

サーブレット仕様の引用

「各リクエストおよびレスポンス オブジェクトは、サーブレットのサービス メソッドのスコープ内、またはフィルタの doFilter メソッドのスコープ内でのみ有効です。コンテナは通常、リクエスト オブジェクト作成のパフォーマンス オーバーヘッドを回避するために、リクエスト オブジェクトをリサイクルします。開発者は認識している必要があります。上記の範囲外の要求オブジェクトへの参照を維持することは、不確定な結果になる可能性があるため、推奨されません。」

于 2012-05-19T13:00:06.163 に答える
0

何が起こるかというと、サーブレットは即座に再入不可になり、複数のクライアントから同時に呼び出されたときに確実に失敗します。これをしてはいけません。

于 2012-05-20T02:32:48.120 に答える
0

これは間違いなく問題を引き起こします。サーブレットはシングルトンであるため、インスタンス変数は共有されるため、同時リクエストとレスポンス オブジェクトはオーバーライドされます。

于 2012-05-19T12:54:34.560 に答える
-2

これは問題であり、HttpServletRequest リクエスト/HttpServletResponse レスポンスをインスタンス変数として宣言することはお勧めできません。実際、サーブレットはシングル スレッド モデルを実装しています。つまり、サーブレット インスタンスは 1 つだけ作成されます。そして、リクエストごとに 1 つのスレッド。したがって、それらのリクエストが多数の場合、thr は多数のスレッドである必要があり、それぞれが同じサーブレット インスタンスを共有すると、データの不一致またはデータの不一致の問題が発生します。スレッドは同じインスタンスで機能します。

于 2012-05-19T12:56:33.013 に答える