サーブレットの基礎知識

サーブレットのライフサイクルについて教えてください

テンアートニ 中越智哉
2001/1/19

 サーブレットが動作する際のライフサイクルを、順に説明します。

(1)サーブレット動作前
サーブレットのインスタンスは、通常、リクエストを受けるまでは、サーブレットコンテナ内には存在していません(ただし、サーブレットコンテナの設定によっては、コンテナ起動時に特定のサーブレットをロードさせておくことも可能です)。

(2)サーブレットのロード
あるサーブレットに対して、クライアントから初めてリクエストがあった場合、サーブレットコンテナは、クラスパスをサーチして、該当するサーブレットのクラスファイルからインスタンスを生成し、サーブレットコンテナにロードします。

その際、サーブレットでは初期化処理として、initメソッドが実行されます。initメソッドは、サーブレットがロードされるときに1度だけ実行され、それ以降のリクエストでは実行されません。

(3)サーブレットの実行
サーブレットに対してリクエストがあった場合、リクエストの種類によって、サーブレットのdoGetもしくはdoPostのどちらかのメソッドが実行されます。これらのメソッドが実行された後も、サーブレットはコンテナに常駐し、以後、同じサーブレットに対してリクエストがあっても、メモリへのロードや初期化処理などを行うことなく、doGet(doPost)メソッドだけを繰り返し実行することができます。

(4)サーブレットのアンロード
管理ツールなどで指示があった場合、サーブレットコンテナからサーブレットをアンロードさせることができます。この場合、アンロードが行われる前に、サーブレットのdestroyメソッドが実行されます。

(5)サーブレットのリロード
サーブレットコンテナの設定により、クラスファイルが更新された場合に、自動で新しいクラスを再ロードさせることもできます。サーブレットをリロードする際は、古いサーブレットのアンロードと、新しいサーブレットのロードが連続して行われます。そのため、その時点で継続していたセッション情報が失われてしまいます。ですから、この機能は、あくまで開発時のデバッグ用と考え、本番環境での運用時にはリロードを行わない設定にしておくべきでしょう。

 このようなライフサイクルにすることによって、複数クライアントからのリクエストを受けた場合にも、同じサーブレットの初期化処理、終了処理をリクエストごとに行う必要がなく、必要な処理だけを繰り返して実行させることができ、パフォーマンスの向上が図られています。

 

「Java Solution FAQ」



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間