2.5.4 JSP事前コンパイルの実行時の処理
ここでは,JSP事前コンパイル実行時に実施されるチェックやJSP事前コンパイル機能を実行したJ2EEアプリケーションの動作について説明します。
(1) JSP事前コンパイルで実施されるチェック
JSP事前コンパイルの実行時には,web.xmlの妥当性チェック,およびJSPコンパイル結果のバージョンチェックが実施されます。
(a) web.xmlの妥当性チェック
JSP事前コンパイル機能では,コンパイル処理を実行する前に,web.xmlがDTDまたはXMLスキーマに従っているかどうかの検証が実施されます。また,JSP事前コンパイル時に参照する要素については,JSP事前コンパイルに必要な範囲で,設定値が妥当であるかどうかについても検証されます。スキーマに従っていない場合は,JSPファイルからJavaファイルを生成するJSPのトランスレーション時に,エラーが発生します。
JSP事前コンパイル実行時に検証されるweb.xmlの要素を次の表に示します。
(b) JSPコンパイル結果のバージョンチェック
JSP事前コンパイル機能使用時,J2EEサーバはweb.xmlで指定されたWebアプリケーションのバージョンと,JSPコンパイル時のJSPのバージョンが合致するかチェックします。バージョンのチェックは次のタイミングで実施されます。
-
アプリケーション開始時に,JSP事前コンパイルを実施する指定をしていないとき(-jspcオプションを指定しないで,cjstartappコマンドでアプリケーションを開始したとき)
-
cjjspcコマンドを使用して,コンパイル対象外ファイルを指定してWebアプリケーション単位のJSP事前コンパイルを実行したとき
-
cjjspcコマンドを使用して,JSPファイル単位にJSP事前コンパイルを実行したとき
JSPから生成されるクラスファイルは,web.xmlで指定されたWebアプリケーションのバージョンに依存します。JSP事前コンパイル実行時のWebアプリケーションとバージョンが異なるWebアプリケーションで使用することはできません。このため,Webアプリケーションのバージョンを変更した際には,すべてのJSPファイルをコンパイルする必要があります。
なお,次の場合は,Webアプリケーションに含まれるすべてのJSPをコンパイルするため,JSPコンパイル結果のチェックは実施されません。
-
コンパイル対象外ファイルを指定しないでWebアプリケーション単位のJSP事前コンパイルを実行したとき
-
アプリケーション開始時のJSP事前コンパイルを実行したとき
- 参考
-
JSPコンパイル結果のバージョンチェックが実施されると,コンパイル対象のWebアプリケーションのJSPワークディレクトリに,JSPファイルのバージョン情報が記述されたバージョン情報ファイルが生成されます。バージョン情報ファイルは次の場所に生成されます。
<Webアプリケーションのディレクトリ>/WEB-INF/<JSPワークディレクトリ名>/WEB-INF/<JSPワークディレクトリ名>/jsp_compile_info
(c) TLDファイルのチェック
TLDファイルは,JSP事前コンパイル実行時にDTDまたはXMLスキーマに従っているかどうか検証されます。WebアプリケーションのバージョンごとにTLDファイルのチェックについて説明します。
-
Webアプリケーションのバージョンが2.4以降の場合
デフォルトで検証が実施されます。なお,スキーマに従っていない場合,JSPファイルのトランスレーション時にエラーとなります。
-
Webアプリケーションのバージョンが2.3以前の場合
あらかじめ,検証をするかどうか設定しておく必要があります。TLDファイルを検証する設定をしている場合に,JSP事前コンパイル実行時に検証されます。
なお,TLDファイルの検証については,「2.5.8 実行環境での設定(J2EEサーバの設定)」を参照してください。
(2) JSP事前コンパイル機能を実施したアプリケーションでのJSPファイルの扱い
JSP事前コンパイル機能を実行したJ2EEアプリケーションの動作について説明します。
(a) リクエスト実行時およびJ2EEアプリケーション開始時の動作
JSP事前コンパイルを実施していると,リクエスト実行時にはJSPコンパイルは実施されません。事前コンパイル時に作成したJSPのクラスファイルがロードされ,実行されます。
このとき,JSPファイルからコンパイルされたクラスファイルがない場合などには,エラーになります。JSP事前コンパイルを実施していて,ファイルがない場合のJ2EEサーバの挙動を次の表に示します。
存在しないファイル |
J2EEサーバの挙動 |
|
---|---|---|
JSPファイル |
JSPファイル |
JSPファイルを参照しない |
クラスファイル |
404エラーを返す |
|
タグファイル |
タグファイル |
タグファイルを参照しない |
クラスファイル |
500エラーを返す(java.lang.NoClassDefFoundErrorが発生する) |
|
静的インクルードされたファイル |
静的インクルードされたファイルを参照しない |
|
TLDファイル |
TLDファイルを参照しない |
事前コンパイルを実施してない場合でファイルがないときは,J2EEサーバは次のように動作します。
存在しないファイル |
J2EEサーバの挙動 |
|
---|---|---|
JSPファイル |
JSPファイル |
404エラーを返す |
クラスファイル |
JSPファイルをコンパイルする |
|
タグファイル |
タグファイル |
500エラーを返す(コンパイルエラー) |
クラスファイル |
タグファイルをコンパイルする |
|
静的インクルードされたファイル |
500エラーを返す(コンパイルエラー) |
|
TLDファイル |
(b) J2EEアプリケーション開始時の動作
web.xmlでJSPファイルに<load-on-startup>を指定したWebアプリケーションのJSPファイルを事前コンパイルした場合,J2EEアプリケーション開始時には,JSPコンパイルは実施されません。JSP事前コンパイル時に生成されたクラスファイルがロードされ,jspInitメソッドが実行されます。このとき,JSPのクラスファイルまたはJSPが依存するクラスファイルがない場合は,JSPファイルのロードに失敗します。
なお,サーブレットとJSPのエラー通知の設定が有効になっている場合は,Webアプリケーション開始時に失敗します。サーブレットとJSPのエラー通知の設定については,マニュアル「アプリケーションサーバ アプリケーション設定操作ガイド」の「9.16 サーブレットとJSPのエラー通知の設定」を参照してください。
(3) JSP事前コンパイル機能の注意
ここでは,JSP事前コンパイル機能での注意事項を説明します。
-
「jsp_precompile」を付加したリクエストの送信
JSP事前コンパイルを実行したアプリケーションに,クエリ文字列「jsp_precompile」,または「jsp_precompile=true」を付加したリクエストを送信しても,JSPコンパイルは実行されません。
-
JSP事前コンパイルのコマンドの複数起動による同じWebアプリケーションの操作
cjjspcコマンドの複数起動によって同じWebアプリケーションに対するJSP事前コンパイルを実行することはできません。また,アプリケーション開始時のJSP事前コンパイル実行時にcjjspcコマンドによって同じWebアプリケーションに対するコンパイル処理を実行することはできません。
なお,コマンドの排他処理のため,JSP事前コンパイル実行中には,JSPワークディレクトリにロックファイルが生成されます。ロックファイルは次の場所に生成されます。
<Webアプリケーションのディレクトリ>/WEB-INF/<JSPワークディレクトリ名>/WEB-INF/<JSPワークディレクトリ名>/ExecutingJspPrecompilation.lock
-
JSPコンパイル結果を使用するアプリケーションに移行する場合
アーカイブ形式のJ2EEアプリケーションの場合,アプリケーション開始時のJSP事前コンパイルで生成したコンパイル結果は,アプリケーションの停止時に削除されます。
アプリケーション開始時のJSP事前コンパイルで生成したJSPコンパイル結果を,アプリケーションの停止後も利用する場合の手順を,J2EEアプリケーションの形式ごとに説明します。
アーカイブ形式のJ2EEアプリケーションの場合
-
アプリケーション開始時のJSP事前コンパイルを実行する
-
アプリケーションをエクスポートする
-
リデプロイ機能などを使用して,JSPコンパイル結果を含むアプリケーションに入れ替える
展開ディレクトリ形式のJ2EEアプリケーションの場合
-
cjjspcコマンドまたはアプリケーション開始時にJSP事前コンパイルを実行する
-
-
JSPコンパイル結果を使用しないアプリケーションに移行する場合
JSP事前コンパイルで生成されたJSPコンパイル結果を使用しない場合は,JSPワークディレクトリを,ディレクトリごと削除する必要があります。
JSPコンパイル結果を使用しない場合の手順を,J2EEアプリケーションの形式ごとに説明します。
アーカイブ形式のJ2EEアプリケーションの場合
-
J2EEアプリケーションをエクスポートする
-
EARファイルを展開する
-
<Webアプリケーションのルートディレクトリ>/WEB-INFの下にある,JSPワークディレクトリをディレクトリごと削除する
-
EARファイルを作成する
-
リデプロイ機能などを使用して,J2EEアプリケーションを入れ替える
展開ディレクトリ形式のJ2EEアプリケーションの場合
-
J2EEアプリケーションを停止する
-
<Webアプリケーションのルートディレクトリ>/WEB-INFの下にある,JSPワークディレクトリをディレクトリごと削除する
-
J2EEアプリケーションを開始する
-
-
JSPファイルが依存するファイルを修正した場合
タグファイル,静的にインクルードされたファイル,またはTLDファイルを更新した場合は,更新したファイルを参照するすべてのJSPファイルをコンパイルする必要があります。
-
JSP事前コンパイル機能を使用する展開ディレクトリ形式のJ2EEアプリケーションを更新する場合
JSP事前コンパイル機能を使用する展開ディレクトリ形式のJ2EEアプリケーションを更新する場合,次の点に注意してください。
-
JSPファイルまたはタグファイルをJ2EEアプリケーションに追加した場合
追加したJSPファイルまたはタグファイルを参照するJSPファイルを,すべてコンパイルしてください。なお,JSPファイルのコンパイルには,JSP事前コンパイル機能を使用してください。
-
開発環境で更新したJSPコンパイル結果を実行環境に反映する場合
開発環境のJ2EEアプリケーションのJSPワークディレクトリ下にあるクラスファイルを,実行環境のJ2EEアプリケーションのJSPワークディレクトリにコピーしてください。この場合,開発環境でJSP事前コンパイル実行時に更新された,すべてのクラスファイルがコピー対象となります。
-