2. サーブレットの基本
- 2.1. サーブレットのライフサイクル
- 2.2. サーブレット毎の初期設定値の読み出し
- 2.3. リクエストからのパラメータの読み出し
2.1. サーブレットのライフサイクル
全てのサーブレットの基本クラスは「javax.servlet.GenericServlet」クラスです。サーブレットで行われる全ての処理がこのクラスに集められています。この節ではサーブレットのライフサイクルについて説明します。
サーブレットはクライアントから初めて処理要求があったとき、サーブレットコンテナにロードされます。設定により、予めコンテナにロードしておくことも可能ですが、デフォルトでは初めて処理要求があったときにロードされる事になっています。
クラスファイルがロードされると、コンテナはサーブレットの「init」メソッドを実行します。このメソッドはロードされた時に、1度だけ実行されます。したがってこのメソッド内で初期設定(データベースの接続設定など)を行うのが一般的です。ところで「GenericServlet」には「init(ServletConfig)」「init()」と引数が異なる2つのメソッドがあります。通常は引数の無い「init()」メソッドの方をオーバーライドするようにしてください。「init(ServletConfig)」が「init()」を呼び出すようになっています。
クライアントからサーブレットに対して処理要求があると、各要求ごとにスレッドが1つ生成されます。そして各スレッド内で、サーブレットの「service」メソッドが呼び出されます。このメソッド内で、クライアントからのリクエストを解析し、適切な応答を返すことになります。このようにサーブレットは複数のスレッドから呼び出されますので、同時に呼び出されたとしても矛盾が起こらないように、十分に気をつけてプログラミングをする必要があります。
コンテナは最後にサーブレットの「destroy」メソッドを呼び出します。一定時間サーブレットに処理要求が無い場合や、コンテナが終了する場合、このメソッドが呼び出されます。「init」と同じく、1つのライフサイクルで1度しか呼び出されることがありません。
クライアントからのHTTP要求を処理する場合は、通常「javax.servlet.http.HttpServlet」クラスを使用します。このクラスは「GenericServlet」クラスを拡張したクラスで、基本的な動作は同じです。ただHTTPのヘッダーに応じて「doGet」「doPost」などの複数のメソッドが定義されています。これらは全て「service」メソッドからHTTPヘッダーに応じて呼び分けられています。