8.2.9 JSP 2.1仕様で追加,変更された仕様についての注意事項
JSP 2.1仕様で追加,変更された仕様を,アプリケーションサーバ上で利用するときの注意事項を示します。JSP 2.1仕様およびJSP 2.0仕様については,それぞれの仕様書(JSP 2.1仕様書,JSP 2.0仕様書)を参照してください。
- 〈この項の構成〉
-
(1) EL2.1
JSP 2.1仕様のELは,JSP 2.0仕様のELと,JSF1.1仕様のELが統合されたELです。
EL2.1の仕様としてELの文法やAPIが定めてあり,JSP 2.1仕様やJSF1.2仕様で定義される暗黙オブジェクトなどの変数は,ELのAPIを通して使用できます。
次に示すJSP 2.1仕様のELに関する機能の追加および仕様変更について,以降で説明します。
-
#{}の書式のEL
-
TLDへの要素追加
-
下位互換性のオプション追加
(a) #{}の書式のEL
JSP 2.0仕様である${}の書式のELに加え,JSF1.1仕様のELである#{}の書式のELをJSP 2.1仕様の機能として記述できます。
- #{}の書式のELの評価のタイミングについて
-
-
#{}の書式のELはJSP出力時に評価されません。
-
Webコンテナによって,ELの評価結果の値ではなくELのオブジェクトであるjavax.el.ValueExpressionまたはjavax.el.MethodExpressionがタグハンドラに渡されます。渡されたオブジェクトのメソッドが,タグハンドラの実装によって任意のタイミングで評価されます。
-
(b) TLDへの要素追加
JSP 2.1仕様では,#{}の書式を期待するタグの属性であるかどうかを示すため,TLDファイルの<attribute>要素内に次に示す要素が追加されました。
-
<deferred-value>要素
-
<deferred-value>要素内の<type>要素
-
<deferred-method>要素
-
<deferred-method>要素内の<method-signature>要素
また,タグファイルのattributeディレクティブにもここに示したTLDの要素に対応する属性が追加されました。
(c) 下位互換性のオプション追加
JSP 2.1仕様では,EL2.1仕様で#{}の書式が追加されたことに伴い,次の個所に#{}の書式のELを記述するとトランスレーションエラーが発生します。
-
JSPのファイルまたはタグファイルのテンプレートテキスト
-
遅延評価でないカスタムタグの属性値
アプリケーションサーバでは,次に示す要素または属性の値にtrueと指定した場合,テンプレートテキストまたは遅延評価でないカスタムタグの属性値に#{}の書式のELがあってもトランスレーションエラーは発生しません。#{}はそのまま文字列として出力されます。
-
web.xmlの<web-app><jsp-config><jsp-property-group>要素内の<deferred-syntax-allowed-as-literal>要素
-
page,tagディレクティブのdeferredSyntaxAllowedAsLiteral属性
web.xmlでの設定とpage,tagディレクティブでの設定を組み合わせた場合,#{}のELに対してトランスレーションエラーが発生するかどうかを次の表に示します。
web.xmlの<deferred-syntax-allowed-as-literal>要素 |
page,tagディレクティブのdeferredSyntaxAllowedAsLiteral属性 |
||
---|---|---|---|
true |
false |
指定なし |
|
true |
○ |
× |
○ |
false |
○ |
× |
× |
指定なし |
○ |
× |
× |
(2) 不要なホワイトスペースの削除機能
JSP 2.1仕様では,JSPのテンプレートテキストに含まれる不要なホワイトスペースを削除する機能が追加されました。アプリケーションサーバでは,JSP 2.1仕様に従ってこの機能をサポートします。
次に示す要素または属性の値にtrueと指定した場合,JSPの出力時にホワイトスペースだけのテンプレートテキストは削除されます。
-
web.xmlの<web-app><jsp-config><jsp-property-group>要素内の<trim-directive-whitespaces>要素
-
page,tagディレクティブのtrimDirectiveWhitespaces属性
ただし,ホワイトスペースではないテンプレートテキストと連続しているホワイトスペースは削除されません。
web.xmlの<trim-directive-whitespaces>要素 |
page,tagディレクティブのtrimDirectiveWhitespaces属性 |
||
---|---|---|---|
true |
false |
指定なし |
|
true |
○ |
× |
○ |
false |
○ |
× |
× |
指定なし |
○ |
× |
× |
なお,JSPドキュメントのpageディレクティブ,またはXMLシンタックスのtagディレクティブにtrimDirectiveWhitespaces属性を設定した場合,設定値によって次のように処理されます。
-
設定値がtrueまたはfalseの場合,trimDirectiveWhitespaces属性の設定は無視され,正常に処理されます。
-
設定値がtrueまたはfalse以外の不正値を指定した場合,トランスレーションエラーとなります。
(a) ホワイトスペースの削除例
次の図に,JSP要素の間に,ホワイトスペースだけのテンプレートテキストが存在する例を示します。
1〜4行目のtaglibディレクティブは出力しないため無視し,1行目の復帰改行,2行目の復帰改行,および3行目の半角スペースから復帰改行がホワイトスペースだけのテンプレートテキストとなります。
JSPページの4行目の復帰改行は,ホワイトスペースではないテンプレートテキストと連続しているホワイトスペースであるため削除されません。そのため,ホワイトスペースの削除機能が有効な場合,4行目の復帰改行から[EOF]までが出力されます。
(3) タグハンドラに一意の識別子を設定する機能
JSP 2.1仕様では,トランスレーション単位(JSPとincludeディレクティブでインクルードされるファイル)ごとに一意である識別子をタグハンドラに設定する機能が追加されました。この機能は,JspIdConsumerインタフェースをタグハンドラに実装することで使用できます。JspIdConsumerインタフェースのパッケージ名はjavax.servlet.jsp.tagextです。
Webコンテナは,JSPの実行時にこのインタフェースを実装したタグハンドラに対して,インタフェースのsetJspIdメソッドを使用して識別子を設定します。識別子はJSPコンパイル時に決定されるため,リクエスト処理ごとに識別子が変更されるおそれはありません。
一意の識別子として,id<N>という文字列を使用します。<N>は整数値を表します。<N>は0〜2,147,483,647の範囲で割り当てられます。
(4) JSPのAPIの追加
JSP 2.1仕様では次に示すクラスおよびメソッドが追加されました。
-
JSP 2.1仕様で追加されたクラス
パッケージ名
クラス名
javax.servlet.jsp
JspApplicationContext
-
JSP 2.1仕様でコンストラクタが追加されたクラス
パッケージ名
クラス名
javax.servlet.jsp.tagext
TagAttributeInfo
-
JSP 2.1仕様で追加されたメソッド
パッケージ名
クラス名
メソッド名
javax.servlet.jsp
JspFactory
getJspApplicationContext
javax.servlet.jsp.tagext
TagAttributeInfo
getDescription
isDeferredValue
isDeferredMethod
getExpectedTypeName
getMethodSignature
TagLibraryInfo
getTagLibraryInfos
(5) アノテーションの使用
アプリケーションサーバでは,JSP 2.1仕様で規定されたアノテーションをサポートします。アノテーションの使用については,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「17. アノテーションの使用」を参照してください。
(6) タグファイルのバージョンの決定方法
JSP 2.1仕様でタグファイルに記述できる要素が追加されたため,タグファイルのバージョンの明確化が必要になりました。そのため,アプリケーションサーバでは,JSP 2.1仕様に従ってタグファイルのバージョンを決定します。
ただし,タグファイルのバージョンはタグファイルのファイル単位で一致する必要があります。異なるバージョンのTLDファイルを使用して同一のタグファイルを実行した場合の動作は保証されません。
なお,TLDファイルやimplicit.tldなど,バージョン決定要素となるもののバージョンが異なっていても,実際の使用方法で決定するバージョンがファイル単位で一致すれば問題なく動作します。
例えば,次のようにTLDファイルとimplicit.tldのバージョンが異なっていても,常にTLDを使ってタグファイルを使用する場合,または常にJSPからディレクトリを指定して使用する場合は問題なく動作します。
バージョン決定要素 |
バージョン |
---|---|
タグファイルを参照するTLDファイル |
2.1 |
タグファイルを配置しているディレクトリのimplicit.tld |
2.0 |
(7) タグの属性に指定できる要素について
JSP 2.1仕様では,タグの属性の設定でrtexprvalueがfalseの場合,deferredValueまたはdeferredMethodがtrueのときでも,タグの属性にスクリプティング要素の式を指定できません。
アプリケーションサーバでは,タグの属性の設定でrtexprvalueがfalseの場合でも,deferredValueまたはdeferredMethodがtrueのときは,タグの属性にスクリプティング要素の式を指定できます。アプリケーションサーバでのタグの属性の設定と指定できる要素の対応について,次の表に示します。
タグの属性の設定 |
指定できる要素 |
||||
---|---|---|---|---|---|
rtexprvalue |
deferredValueまたはdeferredMethod |
文字列 |
式(<%= %>) |
EL(${}) |
EL(#{}) |
false |
false |
○ |
× |
× |
× |
true |
false |
○ |
○ |
○ |
× |
false |
true |
○ |
○ |
× |
○ |
true |
true |
○ |
○ |
○ |
○ |
(8) エラーページの参照
JSPページのエラー発生時の遷移先としてpageディレクティブのerrorPage属性に自分自身を指定している場合の動作を次に示します。
Servlet仕様/JSP仕様のバージョン |
内容 |
---|---|
Servlet 2.5/JSP 2.1 |
JSP 2.1仕様と同様にトランスレーションエラーとなります※。 |
Servlet 2.4/JSP 2.0 |
JSPにアクセスし例外が発生した場合に,例外に対処しないで,例外が際限なく発生すると,スタックオーバーフローエラーが発生するおそれがあります。 |
(a) トランスレーションエラーとなるエラー発生時の遷移先の指定例
次のようなファイル構成の場合に,トランスレーションエラーとなる,JSPページのエラー発生時の遷移先の指定例について説明します。
example.jspのJSPページのエラー発生時の遷移先に,次のどちらかの方法で自分自身(example.jsp)を指定すると,トランスレーションエラーとなります。
-
ファイル名だけで自分自身を指定する
指定例:<%@ page isErrorPage="true" errorPage="example.jsp" %>
-
コンテキストルートからの相対パスで自分自身を指定する
指定例:<%@ page isErrorPage="true" errorPage="/jsp/example.jsp" %>
(b) 異なるページ間で相互にエラー発生時の遷移先に指定していた場合に発生するエラー
次のようなJSPページがあるとします。
-
JSPページA:エラー発生時の遷移先をJSPページBに設定している。
-
JSPページB:エラー発生時の遷移先をJSPページAに設定している。
JSPページAでエラーが発生し,JSPページBでもエラーが発生した場合,例外が発生してJSPページAに遷移します。ここに示した構造で例外が際限なく発生した場合,スタックオーバーフローエラーとなります。
(9) 拡張子以外同じ名前のタグファイルの扱い
タグファイルには.tagと.tagxの2種類の拡張子があります。example.tagとexample.tagxなど,拡張子だけが異なる同じ名前のタグファイルは配置しないでください。
JSP 2.1仕様では,拡張子だけが異なる同じ名前のタグファイルが配置されている場合,タグライブラリが無効化されます。
アプリケーションサーバでは,拡張子だけが異なる同じ名前のタグファイルが配置されていても,タグライブラリは無効化されません。ただし,タグファイルはファイルシステムから検索されたファイルが使用されます。拡張子だけが異なる同じ名前のタグファイルの場合は,先に検索されたファイルが使用され,ファイルの検索順序については保証されないため,注意してください。
(10) APIの仕様変更
アプリケーションサーバでは,JSP 2.1仕様でのAPIの仕様変更に従ってAPIの仕様を変更します。
なお,Webアプリケーションのクラスで総称を使用するようになったAPIについて,JSP 2.0以前に準拠しているタイプセーフではないメソッドを使用している場合,メソッドの動作に変更はなく,08-00以降でもそのままクラスを使用できます。なお,コンパイル時にjavacコマンドで警告メッセージ(unchecked warning)が発生するようになりますが,動作に影響する警告メッセージではありません。警告メッセージが発生した原因の個所にアノテーション@SuppressWarnings("unchecked")を適用することで警告メッセージが発生しなくなります。
(11) JSPページおよびタグファイルの文字エンコーディングの設定方法
アプリケーションサーバでは,JSP 2.1仕様に従って,JSPページ,および標準シンタックスのタグファイルの文字エンコーディングの設定方法にBOMの付加での設定を追加します。
JSPページについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。JSPページおよびタグファイルの文字エンコーディングの判別方法について,次の表に示します。
JSP仕様のバージョン |
内容 |
---|---|
JSP 2.1 |
JSP 2.1仕様に従って文字エンコーディングが設定されます。ただし,UTF-32のBOMはサポートされません。 |
JSP 2.0 |
BOMの付加での文字エンコーディングの設定はできません。 文字エンコーディングの指定が必要な場合は,web.xmlの<jsp-property-group>要素内の<page-encoding>要素またはpage,tagディレクティブでのpageEncoding属性で指定できます。 |
JSPファイルおよびタグファイルの文字エンコーディングの詳細は「8.2.7(13) JSPでサポートしている文字エンコーディングについて」を参照してください。
Servlet 2.5仕様以降に準拠したWebアプリケーションのJSPページおよびタグファイルでは,BOMの付加で文字エンコーディングを設定するかどうかを次のどちらかの方法で指定できます。
-
簡易構築定義ファイルを使用した指定方法
論理J2EEサーバ(j2ee-server)の<configuration>タグ内で,パラメタwebserver.jsp.jsp_page.bom.enabledの値にBOMの付加での文字エンコーディングを有効にする場合はtrueを,無効にする場合はfalseを指定します。
-
cjjspcコマンドを使用した指定方法
cjjspcコマンドにBOMの付加での文字エンコーディングを有効にする-jsppagedisablebomオプションを指定してJSP事前コンパイルを実施します。
なお,Servlet 2.5仕様以降に準拠したWebアプリケーションのJSPページおよびタグファイルで,BOMの付加での文字エンコーディングを設定しない場合,Servlet 2.4仕様に従ってJSPページの文字エンコーディングが設定されます。
(12) TLDファイルとURIのマッピングについて
TLDファイルとURIのマッピングについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。JSP仕様のバージョンごとのTLDファイルとURIのマッピング方法を次の表に示します。
Version |
マッピング方法 |
---|---|
Servlet 2.5(JSP 2.1) |
JSP 2.1仕様に従って,JSTLおよびJSFのURIを自動的にマッピングします。マッピングするURIは以下のとおりです。
|
Servlet 2.4(JSP 2.0) |
自動的にマッピングしません。JSTL,JSFを使用する場合,通常のTLDファイルと同様に,JSTL,JSF仕様のTLDファイルを配置してください。 |
Servlet 2.5仕様以降に準拠したWebアプリケーションでは,自動的なマッピングが最優先で処理されるため,TLDファイルとURIのマッピングの上書きができません。
そのため,アプリケーションサーバでは,TLDファイルとURIの自動的なマッピングをするかどうかを次のどちらかの方法で指定できます。
-
簡易構築定義ファイルを使用した指定方法
論理J2EEサーバ(j2ee-server)の<configuration>タグ内で,パラメタwebserver.jsp.tld.mapping.java_ee_tag_library.enabledの値に,自動的なマッピングを有効にする場合はtrueを,無効にする場合はfalseを指定します。
-
cjjspcコマンドを使用した指定方法
cjjspcコマンドに自動的なマッピングを無効にする-nojavaeetaglibオプションを指定してJSP事前コンパイルを実施します。
Webアプリケーションごとに複数のバージョンのタグライブラリを使用したい場合は,これらの方法で,自動的なマッピングを無効に設定してください。自動的なマッピングが無効になると,それぞれのWebアプリケーションにライブラリを配置することで複数のバージョンのライブラリを混在させることができます。
(13) ELのエスケープシーケンス
JSP 2.1仕様では,ELの開始を示す文字に"#{"が追加されました。
JSPページおよびJSPドキュメントについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。また,ELの設定を有効にしているかどうかで制御が異なります。
"#"を文字列として表すエスケープシーケンスへの制御について,サーブレットおよびJSP仕様のバージョンごとに次の表に示します。
サーブレット仕様/JSP仕様のバージョン |
仕様 |
|||
---|---|---|---|---|
ELの設定を有効にしている場合 |
ELの設定を無効にしている場合 |
|||
\$の出力 |
\#の出力 |
\$の出力 |
\#の出力 |
|
Servlet 2.5/JSP 2.1 |
$ |
# |
$ |
# |
Servlet 2.4/JSP 2.0 |
$ |
\# |
$ |
\# |
Servlet 2.5仕様に準拠したWebアプリケーションの場合,"\#"は"\$"と同様に条件に関係なくエスケープシーケンスによって#と出力されます。そのため,"\#"と出力したい場合は,"\\#"と記述する必要があります。
JSP 2.0仕様の"\$"のエスケープシーケンスの仕様については「8.2.10(15) EL(Expression Language)のエスケープシーケンスについて」を参照してください。
(14) ELでのEnum型に対する処理の変更
JSP 2.1仕様のELから,Java SE 5仕様で規定されたEnum型のオブジェクトに対応した処理が追加されました。
JSPページおよびJSPドキュメントについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。
アプリケーションサーバでのサーブレットおよびJSP仕様のバージョンごとのELでのEnum型に対する処理について,次の表に示します。
サーブレット仕様/JSP仕様のバージョン |
内容 |
---|---|
Servlet 2.5/JSP 2.1 |
JSP 2.1仕様に従って処理されます。 |
Servlet 2.4/JSP 2.0 |
JSP 2.0仕様に従って,Enum型であってもほかのオブジェクトと同様に処理されます。 |
ただし,JSP 2.1仕様で非推奨となった,JSP 2.0仕様で規定されているELのAPIを使用した場合,Webアプリケーションのバージョンに関係なくJSP 2.0仕様のELの機能範囲で処理されます。
(15) ELでの<,>,lt,gt演算子の処理の変更
JSPページおよびJSPドキュメントについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。
アプリケーションサーバでのELでの<,>,lt,gt演算子の処理について,サーブレットおよびJSP仕様のバージョンごとに次の表に示します。
サーブレット仕様/JSP仕様のバージョン |
内容 |
---|---|
Servlet 2.5/JSP 2.1 |
JSP 2.1仕様に従って,<,>,lt,gt演算子が処理されます。 |
Servlet 2.4/JSP 2.0 |
JSP 2.0仕様に従って,<,>,lt,gt演算子が処理されます。 |
ただし,JSP 2.1仕様で非推奨となった,JSP 2.0仕様で規定されているELのAPIを使用した場合,Webアプリケーションのバージョンに関係なくJSP 2.0仕様のELの機能範囲で処理されます。
(16) ELのAPIの変更
アプリケーションサーバでのJSP仕様のELのAPIについて説明します。
JSP 2.1仕様で追加となったAPIに対応します。JSP 2.1仕様で追加されたELの機能を使用する場合,javax.elパッケージのAPIを使用してください。
JSP 2.0仕様で規定されたELのAPIを使用した場合,JSP 2.0仕様で規定されたELの仕様に従ってELが評価されます。