8

これは、私が数日前に直面したインタビューの質問の 1 つです。

service()からメソッドを呼び出すことは可能destroy()ですか?

前もって感謝します。

4

2 に答える 2

22

destroy()サーブレットの特定のインスタンスをアンロードするときに、サーブレット コンテナによって呼び出されるライフサイクル メソッドです同様に、サーブレットを要求するクライアントがあると、コンテナーが呼び出されます。service()

サーブレットでservice()メソッドからメソッドを呼び出すことはできますか?destroy()

短い答え: はいservice()他の方法と同様です。

長い答え:できますが、意味がありません。service()通常、サーブレットが呼び出されたときにコンテナーによって提供される要求パラメーターと応答パラメーターが必要です。自分で呼び出す場合service()、これらのパラメーターをどのように提供しますか? 何のために?null両方使うservice()空のパラメーターが 2 つあると、何がよい

サーブレットでdestroy()メソッドから メソッドを呼び出すことはできます か?service()

はい、繰り返しますが、他のメソッドと同様にdestroy()内から呼び出すことができます。service()まだ奇妙ではありますが、これは、destroy()定義したロジック (クリーンアップ、属性の削除など) と同じように、場合によっては理にかなっています。


重要: 単純に呼び出すだけではサーブレット インスタンスがアンロードdestroy()されないことに注意してください。プログラムでサーブレットのライフサイクルを管理するのではなく、サーブレット コンテナーが管理します。

于 2013-05-25T03:20:34.573 に答える
2

目的はdestroy()、サーブレット インスタンスによって使用されるすべてのリソースの割り当てを解除/解放することです。destroy()コンテナーの登録解除サーブレットとそのサービスを呼び出すことによって。

はい、任意のメソッドを呼び出すことはできますがservice(request, response) 実行されないため、これらのサービスメソッドが呼び出されたり実行されたりしdestroy()ないため、サービスメソッドを呼び出すのは無意味destroy()です。これらのオブジェクトはコンテナーによって提供されないため、要求と応答は null になります。

public void destroy() {
      try
      { 
          doPost(null, null); // will not be executed 
          doGet(null, null); // will not be executed 
      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
    }

Javaドキュメントから:

public void destroy()

サーブレットがサービスを停止していることをサーブレットに示すために、サーブレット コンテナーによって呼び出されます。このメソッドは、サーブレットのサービス メソッド内のすべてのスレッドが終了した後、またはタイムアウト期間が経過した後にのみ呼び出されます。

サーブレット コンテナがこのメソッドを呼び出した後、このサーブレットでサービス メソッドを再度呼び出すことはありません。

このメソッドにより、保持されているリソース (メモリ、ファイル ハンドル、スレッドなど) をクリーンアップする機会がサーブレットに与えられ、永続的な状態がメモリ内のサーブレットの現在の状態と確実に同期されます。

于 2013-05-25T04:25:59.507 に答える