JSPページのライフサイクル
JSPページは構造的にHTMLに似ているが、実際にはサーブレットとして実行されます。JSPエンジンは、JSPファイルを解析し、同じ動作をする Servletファイルを生成し、コンパイル、実行という手順を踏みます。JSPページにアクセスする時、初回のアクセスに時間が掛かる場合があります。これはこのように JSPページを変換し、Servletのインスタンスを生成しているためです。
また、Servletへ変換されてインスタンスが生成された後は各メソッドの実行が行われますが、JSPファイルの変換→実行→破棄 に至るまででは下表のようなプロセスが実行されます。
| フェーズ名 |
概要 |
| ページの変換 |
JSPファイルを解析し、対応する Javaファイルが生成されます。 |
| ページのコンパイル |
生成されたJavaファイルをコンパイルします。 |
| クラスのロード |
コンパイルされたクラスがロードします。 |
| インスタンスの生成 |
Servletのインスタンスを生成します。 |
| jspInit() の呼び出し |
Servletプログラムを初期化します。他のメソッドより先に呼び出され、一度だけ実行されます。 |
| _jspService() の呼び出し |
リクエストがあるたびに _jspServiceメソッドが呼び出されます。 |
| _jspDestroy() の呼び出し |
サーブレットコンテナは一定時間 Servletプログラムにアクセスがない場合や、自身を終了する場合などにサーブレットコンテナから _jspDestroyメソッドを一度だけ呼び出します。 |
|
Servletのインスタンス生成フェーズ
ページの変換
この段階では JSPページを読み込み、JSPタグの使い方、ディレクティブのスペルミス、一度しか使用できないディレクティブを複数使用する、ディレクティブや標準アクションの属性、値の有効性確認といった構文の検証を JSPエンジンが行います。
また、Beanの使用やカスタムタグライブラリの使い方についても検証して、問題がなければサーブレットクラスを含む Javaファイルを生成します。
ページのコンパイル
この段階では、生成された Javaファイルを javacを使用してコンパイルします。 宣言、スクリプトレット、式で記述されている Javaコードはこの段階でエラーチェックされます。
例えば以下のような記述は JSPタグとしては有効なため、変換は正常に行われます。しかし、行末の「;」が無いためコンパイルの段階でエラーとなります。
<%
out.print("Hello World")
%>
クラスのロード/インスタンスの生成
コンパイルが正常に行われると、サーブレットコンテナはクラスをメモリにロードしてインスタンスを生成します。
各メソッドの実行フェーズ
JSPエンジンによって生成されるクラスは javax.servlet.jsp.HttpJapPageインタフェースを実装します。このインタフェースは以下のようにインタフェースを継承しているため、各インタフェースのメソッドを実装します。
JspPageインタフェースでは、jspInit()と jspDestroy()メソッドが宣言されており、各メソッドはプロトコルに関係なく全てのJSPで実装する。また HttpJspPageインタフェースでは _jspService()メソッドが宣言されており、それぞれサーブレットの init()メソッド、destroy()メソッド、service()メソッドに相当します。
jspInit() の呼び出し
JSPページ初めてリクエストがあった時に JSPページはサーブレットへ変換されます。 サーブレットコンテナ(Tomcatなど)は この Servletプログラムを初期化しますが、その際にこの jspInitメソッドが一度だけ呼び出されます。このメソッドは初期化などの一度だけ行う処理の定義をします。リソースの取得、JSPページ内の <! 各種宣言 > で記述されている部分がこのメソッドに含まれます。
_jspService() の呼び出し
JSPページがあるたびにこの_jspServiceメソッドが呼び出されます。このメソッドは実際の JSPの挙動を定義するメソッドになり、JSPページに含まれる HTML部分や、JSPのスクリプトレット、式は servletへの変換時にこのメソッドへ同等の処理が記述されます。
jspDestroy() の呼び出し
サーブレットコンテナは一定時間 JSPページにアクセスがない場合や、自身を終了する場合などにサーブレットコンテナから jspDestroyメソッドを一度だけ呼び出します。 そのため jspDestroyメソッドでは jspInitで取得したリソースの開放等で使用されます。
|