Servlet ライフサイクル

Servlet のライフサイクルは、作成から破棄までのプロセス全体として定義できます。以下は Servlet が従うプロセスです:

  • Servlet の初期化後に呼び出されるinit ()メソッド。
  • Servlet は呼び出してservice()メソッドでクライアントのリクエストを処理します。
  • Servlet の破棄前に呼び出されるdestroy()メソッド。
  • 最後に、Servlet は JVM のガベージコレクタによってガベージコレクションされます。

では、ライフサイクルのメソッドについて詳しく説明します。

init() メソッド

init メソッドは一度だけ呼び出されるように設計されています。Servlet が最初に作成されたときに呼び出され、その後のユーザーリクエストでは呼び出されません。したがって、Applet の init メソッドと同様に、一度きりの初期化に使用されます。

Servlet は、ユーザーがその Servlet に対応する URL を最初に呼び出したときに作成されますが、サーバーの最初の起動時に Servlet がロードされるように指定することもできます。

ユーザーが Servlet を呼び出すと、Servlet インスタンスが作成され、ユーザーリクエストごとに新しいスレッドが生成され、適切なタイミングで doGet メソッドまたは doPost メソッドに渡されます。init() メソッドは、Servlet のライフサイクル全体で使用されるデータを単純に作成またはロードします。

init メソッドの定義は次のとおりです:

public void init() throws ServletException {
  // 初始化代码...
}

service() メソッド

service() メソッドは、実際のタスクを実行する主要なメソッドです。Servlet コンテナ(つまり Web サーバー)は service() メソッドを呼び出して、クライアント(ブラウザ)からのリクエストを処理し、フォーマットされたレスポンスをクライアントに書き戻します。

サーバーが Servlet リクエストを受信するたびに、サーバーは新しいスレッドを生成してサービスを呼び出します。service() メソッドは HTTP リクエストタイプ(GET、POST、PUT、DELETE など)を確認し、適切なタイミングで doGet、doPost、doPut、doDelete などのメソッドを呼び出します。

以下はこのメソッドの特徴です:

public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
}

service() メソッドはコンテナによって呼び出され、service メソッドは適切なタイミングで doGet、doPost、doPut、doDelete などのメソッドを呼び出します。したがって、service() メソッドに対して何らかの操作を行う必要はなく、クライアントからのリクエストタイプに応じて doGet() または doPost() をオーバーライドするだけで済みます。

doGet() メソッドと doPost() メソッドは、各サービスリクエストで最もよく使用されるメソッドです。以下はこれら 2 つのメソッドの特徴です。

doGet() メソッド

GET リクエストは、URL への通常のリクエスト、または METHOD が指定されていない HTML フォームからのリクエストで、doGet() メソッドによって処理されます。

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

doPost() メソッド

POST リクエストは、METHOD が POST と特別に指定された HTML フォームからのリクエストで、doPost() メソッドによって処理されます。

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

destroy() メソッド

destroy() メソッドは一度だけ呼び出され、Servlet のライフサイクルの終了時に呼び出されます。destroy() メソッドを使用すると、Servlet がデータベース接続を閉じたり、バックグラウンドスレッドを停止したり、Cookie リストやクリックカウンタをディスクに書き込んだり、その他の同様のクリーンアップアクティビティを実行したりできます。

destroy() メソッドを呼び出した後、servlet オブジェクトはガベージコレクションの対象としてマークされます。destroy メソッドの定義は次のとおりです:

  public void destroy() {
    // 终止化代码...
  }

アーキテクチャ図

次の図は、典型的な Servlet ライフサイクルのシナリオを示しています。

  • サーバーに到達した最初の HTTP リクエストは、Servlet コンテナに委任されます。
  • Servlet コンテナは、service() メソッドを呼び出す前に Servlet をロードします。
  • 次に、Servlet コンテナは複数のスレッドによって生成された複数のリクエストを処理し、各スレッドが単一の Servlet インスタンスの service() メソッドを実行します。
Servlet 生命周期
その他の拡張