5.1.7 JSP 2.0仕様で追加,変更された仕様についての注意事項
(1) JSPドキュメントのデフォルト拡張子
JSP 2.0仕様では,JSPドキュメントの標準的な拡張子を「jspx」としています。アプリケーションサーバで利用するWebコンテナでは,「jspx」を拡張子としたファイルは,デフォルトマッピングによってweb.xmlにURLマッピング定義しなくてもJSPドキュメントとして扱われます。
(2) タグファイルのJavaソースファイルとクラスファイルの出力先
タグファイルは,JSPファイルと同様に,JSPのコンパイルによってJavaソースファイルとクラスファイルが生成されます。Javaソースファイルおよびクラスファイルは,JSPコンパイル結果の出力先ディレクトリに出力されます。
JSPコンパイル結果の出力先ディレクトリは変更できます。なお,生成されるJavaソースファイル,およびクラスファイルのパスがOSの上限を超える場合は,出力先ディレクトリを変更する必要があります。
JSPコンパイル結果の出力先ディレクトリについては,JSP事前コンパイル機能を使用している場合,「2.5.5(2) JSPコンパイル結果の出力先」,JSP事前コンパイル機能を使用していない場合,「2.5.6(3) JSPコンパイル結果の出力先」を参照してください。
(3) JSP EL式の評価APIの複数指定
JSP 2.0仕様では,EL式の構文解析と評価をするAPIとして次のAPIが提供されます。
- javax.servlet.jsp.el.ExpressionEvaluatorクラスのevaluateメソッド
- javax.servlet.jsp.el.Expressionクラスのevaluateメソッド
JSP 2.0仕様では,これらのAPIから複数のEL式を指定することはできませんが,アプリケーションサーバでは,複数のEL式を指定できます。
(4) XMLシンタックスで記述されたJSPファイルとタグファイル
- 文字エンコードについて
Webアプリケーションのバージョン2.4で,JSPドキュメントの文字エンコードを指定する場合は,XML宣言で文字エンコードを指定してください。
JSP 1.2仕様の場合は,ファイルの文字エンコードは,pageディレクティブのpageEncoding属性,またはcontentType属性のcharset値で指定していましたが,JSP 2.0仕様からはXML宣言で文字エンコードを指定するように変更されています。
- 標準アクションの接頭辞ついて
JSPの標準アクションは,XML名前空間の「http://java.sun.com/JSP/Page」で識別されます。したがって,XML名前空間の接頭辞で標準アクションを指定する必要があります。接頭辞をjspとした場合の記述例を示します。
<?xml version="1.0" ?>
<jsp:root
xmlns:jsp=http://java.sun.com/JSP/Page
version="2.0">
<jsp:directive.page import="java.util.*"/>
<jsp:useBean id="name" class="test.Bean"/>
</jsp:root> |
- <jsp:root>要素の扱いについて
JSP 2.0仕様から<jsp:root>要素をルート要素に指定していなくても,XMLシンタックスのJSPファイル,またはタグファイルとして扱われます。
JSP 1.2仕様では,JSPドキュメントの条件として<jsp:root>がルート要素に指定されている必要がありましたが,JSP 2.0仕様からは,<jsp:root>が指定されていなくても,web.xmlに定義した<jsp-config><jsp-property-group><is-xml>の値がtrue,または拡張子がjspx,tagxであれば,XMLシンタックス形式のJSPと扱うように変更されています。
(5) pageディレクティブのisThreadSafe属性の非推奨化について
pageディレクティブのisThreadSafe属性は,javax.servlet.SingleThreadModelインタフェースが非推奨となったことによって,JSP 2.0仕様では非推奨とされています。
アプリケーションサーバでは,Webアプリケーションのバージョンに関係なく,pageディレクティブのisThreadSafe属性を使用できます。ただし,Servlet 2.4仕様で,javax.servlet.SingleThreadModelインタフェースが非推奨となった理由に注意して使用してください。
(6) JSPドキュメントのHTTPレスポンスのContentTypeのデフォルト値について
JSP 2.0仕様では,JSPドキュメントを使用した場合に,デフォルトのContentTypeの値が「text/xml」になると追記されています。
アプリケーションサーバでは,JSP 2.0以降の場合は「text/xml」,JSP 1.2の場合は「text/html」をデフォルトとして動作します。
(7) タグライブラリ・ディスクリプタ(TLDファイル)の配置について
JSP 2.0仕様では,タグライブラリ・ディスクリプタの配置場所についての規定が追加されています。
アプリケーションサーバでは,配置するディレクトリによって,JSPのコンパイル時にKDJE39289-Wのメッセージが出力されることがあります。ただし,エラーとはならないでWebアプリケーションが実行されます。
メッセージが出力される条件を次に示します。
- 配置するディレクトリ
- /WEB-INFディレクトリ以下以外
- /WEB-INF/classesディレクトリ以下
- /WEB-INF/libディレクトリ以下
- メッセージが出力されるタイミング
- 該当するタグライブラリ・ディスクリプタを,web.xmlの<taglib><taglib-location>タグに指定して,Webアプリケーション開始するとき
- 該当するタグライブラリ・ディスクリプタを,タグライブラリの宣言で直接指定して使用するJSPをコンパイルするとき
(8) javax.servlet.jsp.tagext.PageDataクラスのgetInputStreamメソッドで取得できるXMLビュー情報について
javax.servlet.jsp.tagext.PageDataオブジェクトのgetInputStreamメソッドで取得できるXMLビュー情報の仕様が,JSP 2.0仕様で変更されています。getInputStreamメソッドは,javax.servlet.jsp.tagext.TagLibraryValidatorクラスのvalidateメソッドの第三引数に指定して使用されます。
アプリケーションサーバでの変更点を,JSP 2.0以降とJSP 1.2に分けて示します。
(a) jsp:id属性
- JSP 2.0以降
- jsp:id属性を付加します。
- JSP 1.2
- jsp:id属性を付加しません。
(b) XMLビューの文字エンコード
- JSP 2.0以降
- XMLビューの文字エンコードを常にUTF-8とし,文字コードをUTF-8としてXML宣言を出力します。
- JSP 1.2
- XMLビューの文字エンコードを常にUTF-8とし,文字コードをUTF-8としてXML宣言を出力しません。
(c) pageディレクティブのpageEncoding属性
- JSP 2.0以降
- pageEncoding属性の値をUTF-8に設定します。pageEncoding属性がない場合は,pageEncoding属性を追加します。
- JSP 1.2
- pageEncoding属性の値は変更しません。
(d) pageディレクティブのcontentType属性
- JSP 2.0以降
- contentType属性の値にServletResponseクラスのsetContentTypeメソッドで設定された値を設定します。contentType属性がない場合は,contentType属性を追加します。
- JSP 1.2
- contentType属性の値は変更しません。
(9) includeディレクティブでインクルードされるファイルのデフォルトの文字コードについて
JSP 2.0仕様では,pageディレクティブのpageEncoding属性は,pageEncoding属性を記述したファイルにだけ適用されることが追記されています。
アプリケーションサーバでは,Webアプリケーションのバージョンに関係なく,includeディレクティブでファイルをインクルードするときに,インクルード先のファイルに文字コードの指定がないと,インクルード元の文字コードがインクルード先のファイルに適用されます。
(10) JSPドキュメント内の矛盾する文字コードについて
JSPドキュメントでのXML宣言に指定する文字コードと,JSPドキュメントでのpageディレクティブのpageEncoding属性に指定する文字コードが異なる場合の仕様がJSP 2.0仕様では追記されています。JSP 1.2仕様には記述がありません。
アプリケーションサーバで文字コードが異なる場合の制御を,JSP 2.0以降とJSP 1.2に分けて示します。
- JSP 2.0以降
- トランスレーションエラーとなります。
- JSP 1.2
- pageディレクティブのpageEncoding属性が使用されます。
(11) JSPドキュメントでのHTTPレスポンスの文字コードのデフォルト値について
JSPドキュメントでpageディレクティブのcontentType属性がない場合や,属性にCHARSET値がない場合に使用されるHTTPレスポンスのデフォルトの文字コードがJSP 2.0仕様では追記されています。
アプリケーションサーバでのデフォルト値を,JSP 2.0以降とJSP 1.2に分けて示します。
- JSP 2.0以降
- UTF-8が使用されます。
- JSP 1.2
- ISO-8859-1が使用されます。
(12) pageディレクティブのpageEncoding属性の複数回指定について
pageディレクティブのpageEncoding属性の複数回指定について,JSP 2.0仕様では仕様が変更されています。
JSP 2.0仕様では,トランスレーション単位(JSPとincludeディレクティブでインクルードされるファイル)でpageEncoding属性の複数回指定ができるようになっています。また,同じJSPファイル内でpageEncoding属性の複数回指定をするとコンパイルエラーとなることが追記されています。
アプリケーションサーバでは,Webアプリケーションのバージョンに関係なく,トランスレーション単位でpageEncoding属性の複数回指定ができます。このとき,ファイル単位に指定した値が該当するファイルに適用されます。また,同じJSPファイル内でのpageEncoding属性の複数回指定については,JSP 2.0以降とJSP 1.2で仕様が異なります。アプリケーションサーバでの仕様を,JSP 2.0以降とJSP 1.2に分けて示します。
- JSP 2.0以降
- 一つのファイルに1回だけ指定できます。複数回指定した場合は,コンパイルエラーとなります。
- JSP 1.2
- 一つのファイルに複数回指定できます。最初に記述した値が適用されます。
(13) JSPドキュメントのタグライブラリの宣言でtaglibマップに登録されていないuriを記述した場合について
JSPドキュメントでnamespaceを使ってタグライブラリを宣言し,指定したuriがtaglibマップ(uriとタグライブラリ・ディスクリプタのマッピング)で見つからない場合の動作について,JSP 2.0仕様では追記されています。
アプリケーションサーバでの動作を,JSP 2.0以降とJSP 1.2に分けて示します。
- JSP 2.0以降
- 指定したuriがtaglibマップに登録されていない場合,uriのnamespaceで定義されたアクションは,解析しないで扱われます(テキストとして出力されます)。
- JSP 1.2
- uriが絶対URIの場合
トランスレーションエラーとなります。
- uriが絶対URI以外の場合
Webアプリケーション内のパスとしてTLDファイル(タグライブラリ・ディスクリプタ)を検索して使用されます。TLDファイルがない場合は,トランスレーションエラーとなります。
(14) JSPドキュメントの文字コードについて
JSPドキュメントでのファイルの文字コードの決定方法について,JSP 2.0仕様で仕様が変更されています。
アプリケーションサーバでの文字コードの決定方法を,JSP 2.0以降とJSP 1.2に分けて示します。
- JSP 2.0以降
- XML 1.0の仕様に従い,XML宣言に従います。XML宣言がない場合はデフォルト値のUTF-8となります。
- JSP 1.2
- pageディレクティブのpageEncoding属性に従います。pageEncoding属性がない場合はcontentType属性のcharset=で指定した文字コードに従います。どちらもない場合はデフォルト値のISO-8859-1になります。
(15) EL(Expression Language)のエスケープシーケンスについて
JSP 2.0仕様であるELの開始を示す"${"に含まれる"$"を文字列として表すエスケープシーケンスについて,JSP仕様と,アプリケーションサーバで利用するWebコンテナの仕様を次に示します。
アプリケーションサーバで利用するWebコンテナでは,"¥$"はエスケープシーケンスによって,"$"と出力されます。"¥$"と出力したい場合は,"¥¥$"と記述します。
"¥$"と記述した場合の動作を,JSP 2.0とJSP 1.2に分けて示します。
- JSP 2.0
- JSP 2.0仕様では,ELの設定を無効に設定している場合,"$"はELの開始文字とする必要がなく,"¥"は制御コードとしては扱われません。JSP 2.0で動作する場合は,ELの設定を有効にしているかどうかによって,"¥$"の出力結果が異なります。JSP 2.0で動作する場合の"¥$"の出力結果を次の表に示します。
表5-31 JSP 2.0で動作する場合の"¥$"の出力結果
ELの設定の有効/無効 | 仕様 | 出力結果 |
---|
有効 | JSP 2.0仕様 | "$" |
アプリケーションサーバで利用するWebコンテナ | "$" |
無効 | JSP 2.0仕様 | "¥$" |
アプリケーションサーバで利用するWebコンテナ | "$" |
- ELの設定を無効にする場合は,次に示すどれかの方法で設定します。
- pageディレクティブのisELIgnored属性にtrueを指定する。
- tagディレクティブのisELIgnored属性にtrueを指定する。
- web.xmlの<el-ignored>タグにtrueを指定する。
- JSP 1.2
- JSP 1.2仕様では"$"は予約語ではありません。"¥"は制御コードとしては扱われないため,"¥$"と出力されます。
- アプリケーションサーバで利用するWebコンテナでは,JSP1.2で動作する場合でも"¥"は制御コードとして扱われるため,"$"と出力されます。ただし,JSPドキュメント形式の属性値で使用する場合は,"¥$"と出力されます。
- JSP 1.2で動作する場合の"¥$"の出力結果を次の表に示します。
表5-32 JSP 1.2で動作する場合の"¥$"の出力結果
仕様 | 出力結果 |
---|
JSP 1.2仕様 | "¥$" |
アプリケーションサーバで利用するWebコンテナ | "$" |
(16) ELの評価結果の型について
カスタムタグの属性に指定したELの評価結果の型について,JSP仕様と,アプリケーションサーバの仕様を次に示します。
- JSP 2.0仕様
- ELの評価結果は,カスタムタグの属性の期待する型に変換されます。
- アプリケーションサーバ
- ELの評価結果は,カスタムタグの属性に対応するセッターメソッドの引数の型に変換されます。TLDの属性の定義に記述されたtype要素は型の変換に使用しません。
- ELの記載個所がタグファイルの場合,attributeディレクティブのtype属性に指定した型に変換されます。
ELの評価結果の型がJSP仕様とアプリケーションサーバで異なる場合の例について次に示します。
- 例
- カスタムタグの属性名:attr
- カスタムタグのセッターのシグニチャ:void setAttr(java.lang.String hoge)
- TLDでのattr属性のtype要素の値:java.lang.Integer
この例の場合,ELの評価結果の型は次に示す型になります。
- JSP 2.0仕様
- java.lang.Integerに変換されます。
- アプリケーションサーバ
- java.lang.Stringに変換されます。