Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)
JSP 2.1仕様で追加,変更された仕様を,アプリケーションサーバ上で利用するときの注意事項を示します。JSP 2.1仕様およびJSP 2.0仕様については,それぞれの仕様書(JSP 2.1仕様書,JSP 2.0仕様書)を参照してください。
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に関する機能の追加および仕様変更について,以降で説明します。
JSP 2.0仕様である${}の書式のELに加え,JSF1.1仕様のELである#{}の書式のELをJSP 2.1仕様の機能として記述できます。
JSP 2.1仕様では,#{}の書式を期待するタグの属性であるかどうかを示すため,TLDファイルの<attribute>要素内に次に示す要素が追加されました。
また,タグファイルのattributeディレクティブにもここに示したTLDの要素に対応する属性が追加されました。
JSP 2.1仕様では,EL2.1仕様で#{}の書式が追加されたことに伴い,次の個所に#{}の書式のELを記述するとトランスレーションエラーが発生します。
アプリケーションサーバでは,次に示す要素または属性の値にtrueと指定した場合,テンプレートテキストまたは遅延評価でないカスタムタグの属性値に#{}の書式のELがあってもトランスレーションエラーは発生しません。#{}はそのまま文字列として出力されます。
web.xmlでの設定とpage,tagディレクティブでの設定を組み合わせた場合,#{}のELに対してトランスレーションエラーが発生するかどうかを次の表に示します。
表6-26 web.xmlでの設定とpage,tagディレクティブでの設定を組み合わせた場合のトランスレーションエラーの発生有無
web.xmlの<deferred-syntax-allowed-as-literal>要素 | page,tagディレクティブのdeferredSyntaxAllowedAsLiteral属性 | ||
---|---|---|---|
true | false | 指定なし | |
true | ○ | × | ○ |
false | ○ | × | × |
指定なし | ○ | × | × |
注 web.xmlでの設定よりpage,tagディレクティブでの設定が優先されます。
JSP 2.1仕様では,JSPのテンプレートテキストに含まれる不要なホワイトスペースを削除する機能が追加されました。アプリケーションサーバでは,JSP 2.1仕様に従ってこの機能をサポートします。
次に示す要素または属性の値にtrueと指定した場合,JSPの出力時にホワイトスペースだけのテンプレートテキストは削除されます。
ただし,ホワイトスペースではないテンプレートテキストと連続しているホワイトスペースは削除されません。
表6-27 web.xmlでの設定とpage,tagディレクティブでの設定を組み合わせた場合のホワイトスペースの削除機能の有効/無効
web.xmlの<trim-directive-whitespaces>要素 | page,tagディレクティブのtrimDirectiveWhitespaces属性 | ||
---|---|---|---|
true | false | 指定なし | |
true | ○ | × | ○ |
false | ○ | × | × |
指定なし | ○ | × | × |
注 web.xmlでの設定よりpage,tagディレクティブでの設定が優先されます。
なお,JSPドキュメントのpageディレクティブ,またはXMLシンタックスのtagディレクティブにtrimDirectiveWhitespaces属性を設定した場合,設定値によって次のように処理されます。
次の図に,JSP要素の間に,ホワイトスペースだけのテンプレートテキストが存在する例を示します。
図6-8 ホワイトスペースだけのテンプレートテキストが存在する例
1〜4行目のtaglibディレクティブは出力しないため無視し,1行目の復帰改行,2行目の復帰改行,および3行目の半角スペースから復帰改行がホワイトスペースだけのテンプレートテキストとなります。
JSPページの4行目の復帰改行は,ホワイトスペースではないテンプレートテキストと連続しているホワイトスペースであるため削除されません。そのため,ホワイトスペースの削除機能が有効な場合,4行目の復帰改行から[EOF]までが出力されます。
JSP 2.1仕様では,トランスレーション単位(JSPとincludeディレクティブでインクルードされるファイル)ごとに一意である識別子をタグハンドラに設定する機能が追加されました。この機能は,JspIdConsumerインタフェースをタグハンドラに実装することで使用できます。JspIdConsumerインタフェースのパッケージ名はjavax.servlet.jsp.tagextです。
Webコンテナは,JSPの実行時にこのインタフェースを実装したタグハンドラに対して,インタフェースのsetJspIdメソッドを使用して識別子を設定します。識別子はJSPコンパイル時に決定されるため,リクエスト処理ごとに識別子が変更されるおそれはありません。
一意の識別子として,id<N>という文字列を使用します。<N>は整数値を表します。<N>は0〜2,147,483,647の範囲で割り当てられます。
JSP 2.1仕様では次に示すクラスおよびメソッドが追加されました。
パッケージ名 | クラス名 |
---|---|
javax.servlet.jsp | JspApplicationContext |
パッケージ名 | クラス名 |
---|---|
javax.servlet.jsp.tagext | TagAttributeInfo |
パッケージ名 | クラス名 | メソッド名 |
---|---|---|
javax.servlet.jsp | JspFactory | getJspApplicationContext |
javax.servlet.jsp.tagext | TagAttributeInfo | getDescription |
isDeferredValue | ||
isDeferredMethod | ||
getExpectedTypeName | ||
getMethodSignature | ||
TagLibraryInfo | getTagLibraryInfos |
アプリケーションサーバでは,JSP 2.1仕様で規定されたアノテーションをサポートします。アノテーションの使用については,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「12. アノテーションの使用」を参照してください。
JSP 2.1仕様でタグファイルに記述できる要素が追加されたため,タグファイルのバージョンの明確化が必要になりました。そのため,アプリケーションサーバでは,JSP 2.1仕様に従ってタグファイルのバージョンを決定します。
ただし,タグファイルのバージョンはタグファイルのファイル単位で一致する必要があります。異なるバージョンのTLDファイルを使用して同一のタグファイルを実行した場合の動作は保証されません。
なお,TLDファイルやimplicit.tldなど,バージョン決定要素となるもののバージョンが異なっていても,実際の使用方法で決定するバージョンがファイル単位で一致すれば問題なく動作します。
例えば,次のようにTLDファイルとimplicit.tldのバージョンが異なっていても,常にTLDを使ってタグファイルを使用する場合,または常にJSPからディレクトリを指定して使用する場合は問題なく動作します。
表6-28 バージョン決定要素のバージョンが異なっている例
バージョン決定要素 | バージョン |
---|---|
タグファイルを参照するTLDファイル | 2.1 |
タグファイルを配置しているディレクトリのimplicit.tld | 2.0 |
JSP 2.1仕様では,タグの属性の設定でrtexprvalueがfalseの場合,deferredValueまたはdeferredMethodがtrueのときでも,タグの属性にスクリプティング要素の式を指定できません。
アプリケーションサーバでは,タグの属性の設定でrtexprvalueがfalseの場合でも,deferredValueまたはdeferredMethodがtrueのときは,タグの属性にスクリプティング要素の式を指定できます。アプリケーションサーバでのタグの属性の設定と指定できる要素の対応について,次の表に示します。
表6-29 タグの属性の設定と指定できる要素の対応
タグの属性の設定 | 指定できる要素 | ||||
---|---|---|---|---|---|
rtexprvalue | deferredValueまたはdeferredMethod | 文字列 | 式(<%= %>) | EL(${}) | EL(#{}) |
false | false | ○ | × | × | × |
true | false | ○ | ○ | ○ | × |
false | true | ○ | ○ | × | ○ |
true | true | ○ | ○ | ○ | ○ |
(凡例)○:指定できる ×:指定できない
JSPページのエラー発生時の遷移先としてpageディレクティブのerrorPage属性に自分自身を指定している場合の動作を次に示します。
表6-30 JSPページのエラー発生時の遷移先としてpageディレクティブのerrorPage属性に自分自身を指定している場合の動作
Servlet仕様/JSP仕様のバージョン | 内容 |
---|---|
Servlet 2.5/JSP 2.1 | JSP 2.1仕様と同様にトランスレーションエラーとなります※。 |
Servlet 2.4/JSP 2.0 | JSPにアクセスし例外が発生した場合に,例外に対処しないで,例外が際限なく発生すると,スタックオーバーフローエラーが発生するおそれがあります。 |
次のようなファイル構成の場合に,トランスレーションエラーとなる,JSPページのエラー発生時の遷移先の指定例について説明します。
example.jspのJSPページのエラー発生時の遷移先に,次のどちらかの方法で自分自身(example.jsp)を指定すると,トランスレーションエラーとなります。
次のようなJSPページがあるとします。
JSPページAでエラーが発生し,JSPページBでもエラーが発生した場合,例外が発生してJSPページAに遷移します。ここに示した構造で例外が際限なく発生した場合,スタックオーバーフローエラーとなります。
タグファイルには.tagと.tagxの2種類の拡張子があります。example.tagとexample.tagxなど,拡張子だけが異なる同じ名前のタグファイルは配置しないでください。
JSP2.1仕様では,拡張子だけが異なる同じ名前のタグファイルが配置されている場合,タグライブラリが無効化されます。
アプリケーションサーバでは,拡張子だけが異なる同じ名前のタグファイルが配置されていても,タグライブラリは無効化されません。ただし,タグファイルはファイルシステムから検索されたファイルが使用されます。拡張子だけが異なる同じ名前のタグファイルの場合は,先に検索されたファイルが使用され,ファイルの検索順序については保証されないため,注意してください。
アプリケーションサーバでは,JSP 2.1仕様でのAPIの仕様変更に従ってAPIの仕様を変更します。javax.servlet.jsp.JspExceptionの動作変更の詳細については「6.2.13(2) javax.servlet.ServletException,およびjavax.servlet.jsp.JspExceptionで生成したオブジェクトに対するinitCause(Throwable)の呼び出しについて」を参照してください。
なお,Webアプリケーションのクラスで総称を使用するようになったAPIについて,JSP 2.0以前に準拠しているタイプセーフではないメソッドを使用している場合,メソッドの動作に変更はなく,08-00以降でもそのままクラスを使用できます。なお,コンパイル時にjavacコマンドで警告メッセージ(unchecked warning)が発生するようになりますが,動作に影響する警告メッセージではありません。警告メッセージが発生した原因の個所にアノテーション@SuppressWarnings("unchecked")を適用することで警告メッセージが発生しなくなります。
アプリケーションサーバでは,JSP 2.1仕様に従って,JSPページ,および標準シンタックスのタグファイルの文字エンコーディングの設定方法にBOMの付加での設定を追加します。
JSPページについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。JSPページおよびタグファイルの文字エンコーディングの判別方法について,次の表に示します。
表6-31 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ファイルおよびタグファイルの文字エンコーディングの詳細は「6.2.6(13) JSPでサポートしている文字エンコーディングについて」を参照してください。
Servlet 2.5仕様以降に準拠したWebアプリケーションのJSPページおよびタグファイルでは,BOMの付加で文字エンコーディングを設定するかどうかを次のどちらかの方法で指定できます。
なお,Servlet 2.5仕様以降に準拠したWebアプリケーションのJSPページおよびタグファイルで,BOMの付加での文字エンコーディングを設定しない場合,Servlet 2.4仕様に従ってJSPページの文字エンコーディングが設定されます。
TLDファイルとURIのマッピングについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。JSP仕様のバージョンごとのTLDファイルとURIのマッピング方法を次の表に示します。
表6-32 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の自動的なマッピングをするかどうかを次のどちらかの方法で指定できます。
Webアプリケーションごとに複数のバージョンのタグライブラリを使用したい場合は,これらの方法で,自動的なマッピングを無効に設定してください。自動的なマッピングが無効になると,それぞれのWebアプリケーションにライブラリを配置することで複数のバージョンのライブラリを混在させることができます。
JSP 2.1仕様では,ELの開始を示す文字に"#{"が追加されました。
JSPページおよびJSPドキュメントについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。また,ELの設定を有効にしているかどうかで制御が異なります。
"#"を文字列として表すエスケープシーケンスへの制御について,サーブレットおよびJSP仕様のバージョンごとに次の表に示します。
表6-33 #を文字列として表すエスケープシーケンスへの制御
サーブレット仕様/JSP仕様のバージョン | 仕様 | |||
---|---|---|---|---|
ELの設定を有効にしている場合 | ELの設定を無効にしている場合 | |||
\$の出力 | \#の出力 | \$の出力 | \#の出力 | |
Servlet 2.5/JSP 2.1 | $ | # | $ | # |
Servlet 2.4/JSP 2.0 | $ | \# | $ | \# |
Servlet 2.5仕様に準拠したWebアプリケーションの場合,"\#"は"\$"と同様に条件に関係なくエスケープシーケンスによって#と出力されます。そのため,"\#"と出力したい場合は,"\\#"と記述する必要があります。
JSP 2.0仕様の"\$"のエスケープシーケンスの仕様については「6.2.8(15) EL(Expression Language)のエスケープシーケンスについて」を参照してください。
JSP 2.1仕様のELから,Java SE 5仕様で規定されたEnum型のオブジェクトに対応した処理が追加されました。
JSPページおよびJSPドキュメントについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。
アプリケーションサーバでのサーブレットおよびJSP仕様のバージョンごとのELでのEnum型に対する処理について,次の表に示します。
表6-34 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の機能範囲で処理されます。
JSPページおよびJSPドキュメントについては,Webアプリケーションが準拠するJSP仕様に従って制御されます。タグファイルの場合は,タグファイルのバージョンに対応するJSP仕様に従って制御されます。
アプリケーションサーバでのELでの<,>,lt,gt演算子の処理について,サーブレットおよびJSP仕様のバージョンごとに次の表に示します。
表6-35 ELでの<,>,lt,gt演算子の処理
サーブレット仕様/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の機能範囲で処理されます。
アプリケーションサーバでのJSP仕様のELのAPIについて説明します。
JSP 2.1仕様で追加となったAPIに対応します。JSP 2.1仕様で追加されたELの機能を使用する場合,javax.elパッケージのAPIを使用してください。
JSP 2.0仕様で規定されたELのAPIを使用した場合,JSP 2.0仕様で規定されたELの仕様に従ってELが評価されます。
All Rights Reserved. Copyright (C) 2012, 2015, Hitachi, Ltd.