5.1.5 JSP実装時の注意事項
(1) includeディレクティブ利用時の注意
- JSPファイルのincludeディレクティブでファイルをインクルードする場合,インクルード元となるJSPファイルでエンコーディングを指定してください。
- JSPでHTMLなどの静的ファイルをインクルードする場合は,includeアクションを使用しないで,includeディレクティブを使用してください。includeアクションはJSPやサーブレットなど動的なページをインクルードする場合に使用してください。
(2) タグライブラリ利用時の注意
- タグライブラリを作成する場合には,タグライブラリを記述したクラスファイルの先頭にpackage文で必ずパッケージ名を付けるようにしてください。パッケージ名が付いていない場合,そのタグライブラリは正常に動作しません。
- タグライブラリ・ディスクリプタ(TLDファイル)で,<variable>タグ内の<scope>タグ要素には,NESTED,AT_BEGIN,AT_ENDのどれかを指定してください。これら以外の値を指定した場合には,デフォルトのNESTEDが仮定されて実行されます。
- タグライブラリのタグハンドラを実装する場合には,doStartTagメソッド,doAfterBodyメソッド,およびdoEndTagメソッドが仕様で規定されている戻り値を返すようにしてください。仕様で規定されている戻り値以外の値を返した場合,デフォルトの戻り値を仮定して動作します。デフォルトの戻り値とは,javax.servlet.jsp.tagext.TagSupportまたはjavax.servlet.jsp.tagext.BodyTagSupportクラスの各メソッドがオーバーライドしない場合に返す戻り値です。例えば,BodyTagインタフェースを実装したクラス(またはBodyTagSupportクラスを継承したクラス)で,doStartTagメソッドがEVAL_PAGEを戻り値として返した場合,デフォルトの戻り値であるEVAL_BODY_BUFFEREDが返されたと仮定して動作します。
- Webアプリケーションのバージョンが2.3の場合で,かつタグライブラリのタグハンドラで属性の指定を持つカスタムタグを実装した場合,JSPのカスタムタグで同じ属性を複数指定すると,該当するタグハンドラのsetterメソッドが指定された回数呼び出されます。通常指定された値を上書きするようなsetterメソッドを実装している場合には,後ろに記述された属性の値が有効になります。
(3) <%=%>タグ記述時の注意
JSPで<%= %>タグを使用する場合は,その中に「;(セミコロン)」が入らないようにしてください。セミコロンが入っている場合,JSPコンパイルでエラーとなります。
(4) URL指定とマッピング定義によるアクセスについて
直接JSPファイルのパスをURL指定してアクセスする場合とマッピング定義されたURLでアクセスする場合には,それぞれ別々のインスタンスが生成されます。したがって,jspInitメソッドがそれぞれのインスタンスで実行されることに注意してください。なお,<load-on-startup>タグで起動時にロードされるように指定した場合,起動時にロードされるインスタンスは,マッピング定義されたURLでアクセスするものと同じになります。
(5) <jsp:plugin>タグ利用時の注意
JSPページで,pluginアクションまたはJSPドキュメントでの<jsp:plugin>タグのcode属性は必ず指定してください。省略した場合はコンパイルエラーとなります。
(6) JSPドキュメント内のversion属性について
JSPドキュメントでは,<jsp:root>タグの属性として,使用するバージョン情報を記述できます。しかし,JSPで使用できる機能範囲は,該当するJSPを含むWebアプリケーションのweb.xmlのバージョン情報に従います。
例えば,<jsp:root version="1.2">と記述しているJSPドキュメントであっても,JSP 2.0仕様で追加されたJSP ELを使用できます。
(7) taglibディレクティブのuri属性で指定するURIとTLDファイルのマッピングについて
taglibディレクティブのuri属性で指定するURIは,JSP仕様によって次に示すどれかの方法でマッピングします。同じURIを異なるTLDファイルにマッピングすることはできません。URIが重複した場合は,次に示す番号順を優先順位とし,優先順位の高いマッピングが有効になります。
- JSTLおよびJSFのURIの暗黙マッピング(Servlet 2.5仕様以降のWebアプリケーション)
- web.xmlの<taglib>要素の<taglib-uri>要素で指定したURIと,<taglib-location>要素で指定したTLDファイルのマッピング
- Webアプリケーション内のTLDファイルの<uri>要素で指定したURIと,そのTLDファイル自身のマッピング
- ライブラリJAR(cjjspcコマンドの場合は-classpathオプションで指定したJARファイル)の/META-INFディレクトリ以下に格納されたTLDファイルの<uri>要素で指定したURIと,そのTLDファイル自身のマッピング
次に,2.~4.までのURIとTLDファイルのマッピングする場合のディレクトリ構成とファイルの記述例を示します。
(a) web.xmlの<taglib>要素の<taglib-uri>要素で指定したURIと,<taglib-location>要素で指定したTLDファイルのマッピング(2.の場合)
2.の場合のディレクトリ構成とファイルの記述例について説明します。
2.の場合,TLDファイルはWebアプリケーション内に格納されています。2.の場合のディレクトリ構成の例を次に示します。
図5-3 ディレクトリ構成(2.の場合)
![[図データ]](figure/zu050300.gif)
このディレクトリ構成の場合のtaglibディレクティブのuri属性で指定するURIとTLDファイルのマッピングを次の図に示します。
図5-4 URIとTLDファイルのマッピング(2.の場合)
![[図データ]](figure/zu050400.gif)
図中のデータの対応について説明します。
- タグのプリフィックスにtaglibディレクティブで指定したプリフィックスを指定します。
- TLDファイルの<name>要素で指定した値を,JSPファイルのプリフィックスと対応づけます。
- web.xmlの<taglib-uri>要素で,JSPファイルのtaglibディレクティブで指定したuriを指定します。
- web.xmlの<taglib-location>要素で,マッピングするTLDファイル名を指定します。
(b) TLDファイルの<uri>要素で指定したURIと,そのTLDファイル自身をマッピングする場合
3.または4の場合のディレクトリ構成とファイルの記述例について説明します。
3.の場合,TLDファイルはWebアプリケーション内に格納されています。3.の場合のディレクトリ構成の例を次に示します。
図5-5 ディレクトリ構成(3.の場合)
![[図データ]](figure/zu050500.gif)
4.の場合,TLDファイルはライブラリJARの/META-INFディレクトリ以下に格納されています。4.の場合のディレクトリ構成の例を次に示します。
図5-6 ディレクトリ構成(4.の場合)
![[図データ]](figure/zu050600.gif)
3.または4.の場合のディレクトリ構成でのtaglibディレクティブのuri属性で指定するURIとTLDファイルのマッピングを次の図に示します。
図5-7 TLDファイルの<uri>要素で指定したURIと,そのTLDファイル自身のマッピング(3.または4.の場合)
![[図データ]](figure/zu050700.gif)
図中のデータの対応について説明します。
- タグのプリフィックスにtaglibディレクティブで指定したプリフィックスを指定します。
- TLDファイルの<name>要素で指定した値を,JSPファイルのプリフィックスと対応づけます。
- TLDファイルの<url>要素で,JSPファイルのtaglibディレクティブで指定したuriを指定します。
URIの重複が検出された場合,次のメッセージがWebアプリケーション単位で出力され,該当するマッピングは無視されます。
表5-18 URI重複時に出力されるメッセージと出力条件
メッセージID | 出力条件 |
---|
KDJE39314-W | - J2EEサーバモード,サーブレットエンジンモード,またはcjjspcコマンドの場合
- TLDファイルで記述した<uri>要素の内容が,web.xmlの<taglib-uri>要素の内容,またはほかのTLDファイルで記述した<uri>要素の内容と重複したときに出力されます。
- cjjsp2javaコマンドの場合
- TLDファイルで記述した<uri>要素の内容が,コマンド引数-taglibに指定したuriの内容,またはほかのTLDファイルで記述した<uri>要素の内容と重複したときに出力されます。
|
KDJE39315-W | TLDファイルで記述した<uri>要素の内容が,ほかのTLDファイルで記述した<uri>要素の内容と重複したときに出力されます。 |
KDJE39316-W | web.xmlに指定した<taglib>要素の内容と重複する<taglib-uri>要素を持つほかの<taglib>要素が指定されている場合に出力されます。 |
KDJE39325-W | web.xmlの<taglib-uri>要素の内容,またはほかのTLDファイルで記述した<uri>要素の内容が,Java EE仕様のタグライブラリ(JSTL, JSF)のURIと重複したときに出力されます。 |
KDJE39326-W | ライブラリJAR(cjjspcコマンドの場合は-classpathオプションで指定したJARファイル)に格納されたTLDファイルの<uri>要素の内容が,web.xmlの<taglib-uri>要素の内容,またはほかのTLDファイルで記述した<uri>要素の内容と重複したときに出力されます。 |
(8) JSPで動的なページをインクルードする場合の注意
JSPで,JSPやサーブレットなどの動的なページをインクルードする場合は,javax.servlet.RequestDispatcherのincludeメソッドを使用しないで,includeアクションを使用してください。
(9) TLDファイルでのDOCTYPE宣言への内部サブセットの記述について
TLDファイル(タグライブラリ・ディスクリプタ)で,DOCTYPE宣言に内部サブセットを記述しないでください。
タグの要素拡張またはタグライブラリの要素拡張でxsi:schemaLocation属性に指定するURIは絶対URIだけ指定できます。タグの要素拡張またはタグライブラリの要素拡張以外の目的で,Java EE仕様で定められたDTD/XMLスキーマ以外を参照しないでください。
(10) JSPドキュメントおよびXML形式のタグファイルでの外部サブセットURIの指定について
DOCTYPE宣言を指定する場合,外部サブセットURIには絶対URIだけ指定できます。また,XML1.0仕様で定義された外部エンティティ参照をする場合,外部エンティティ宣言に指定するURIには絶対URIだけ指定できます。相対URIを指定した外部サブセットおよび外部エンティティは参照できません。
(11) javax.servlet.ServletRequestオブジェクトのjavax.servlet.jsp.jspException属性の値について
JSPファイルで例外をスローした場合,pageディレクティブのerrorPage属性でエラーページを指定しているとき,例外がjavax.servlet.ServletRequestオブジェクトのjavax.servlet.jsp.jspException属性に設定されるとJSP仕様に記述されていますが,pageディレクティブのerrorPage属性でエラーページを指定しない場合も設定されます。
(12) TLDファイルのバージョンに関する注意事項
07-00以降のバージョンでは,JSPトランスレーション時にTLDファイルのバージョン(TLDファイルが対応するJSPのバージョン)をチェックします。そのため,TLDファイルのバージョンが,Webアプリケーションのバージョンに対応しているJSPおよびTLDファイルのバージョンより上位のJSPの場合,JSPトランスレーションでエラーになります。また,JSP 1.2,およびJSP 2.0仕様以降では,TLDファイルにスキーマ言語を定義する必要があります。
TLDファイルのバージョンは,TLDファイルに記述されたスキーマ言語から判定します。ただし,スキーマ言語が定義されていない場合は,Webアプリケーションのバージョンから判定します。
TLDファイルにスキーマ言語を定義していない場合のTLDファイルのバージョンを次の表に示します。
表5-19 スキーマ言語未定義時のTLDファイルのバージョン
Webアプリケーションのバージョン | TLDファイルのバージョン |
---|
2.2 | 1.1 |
2.3 | 1.2 |
2.4 | 2.0 |
2.5 | 2.1 |
(13) JSPでサポートしている文字エンコーディングについて
ここでは,JSPファイル,およびタグファイルで使用できる文字エンコーディングについて説明します。
(a) JSPページの場合
JSPページで使用できる文字エンコーディングと,文字エンコーディングの指定方法について次に示します。
- JSPページで使用できる文字エンコーディング
JavaVMがサポートしている文字エンコーディングが使用できます。JavaVMがサポートしている文字エンコーディングについては,JDKのドキュメントを参照してください。
ただし,UTF-16などの英数字が複数バイトで表現される文字エンコーディングについては,次の二つの条件を満たしている必要があります。
- Servlet 2.4/JSP 2.0仕様以降に準拠したWebアプリケーションである。
- JSPファイルの先頭にBOMを付加している。
- 文字エンコーディングの指定方法
JSPページに使用する文字エンコーディングは,次に示す方法から一つ以上の方法を選択して指定できます。
- JSPページの先頭にBOMを付加する(Servlet 2.5/JSP 2.1仕様以降に準拠したWebアプリケーションの場合)。
- web.xmlの<jsp-property-group>要素内の<page-encoding>要素に指定する(Servlet 2.4/JSP 2.0仕様以降に準拠したWebアプリケーションの場合)。
- pageディレクティブのpageEncoding属性に指定する(Servlet 2.3/JSP 1.2仕様以降に準拠したWebアプリケーションの場合)。
- pageディレクティブのcontentType属性に指定する。
指定できる文字列は,java.nio API用の正準名とjava.lang API用の正準名に記載されている文字エンコーディング,およびそれらの別名になります。
なお,指定する文字エンコーディングと,JSPページで使用する文字エンコーディングは,必ず一致するようにしてください。
(b) JSPドキュメントの場合(Servlet 2.4仕様以降に準拠したWebアプリケーションの場合)
Servlet 2.4仕様以降に準拠したWebアプリケーション内のJSPドキュメントで使用できる文字エンコーディングと,使用する文字エンコーディングの指定方法について次に示します。
- JSPドキュメントで使用できる文字エンコーディング
Cosminexus XML Processorがサポートしている文字エンコーディング※が使用できます。
ただし,拡張子がjspxでないJSPドキュメントについては,web.xmlの<jsp-property-group>要素内の<is-xml>要素が指定されていない場合,JSPドキュメントの文字エンコーディングにISO-10646-UCS-4は使用できません。
また,UTF-16などの英数字が複数バイトで表現される文字エンコーディングについては,次の二つの条件を満たしている必要があります。
- JSPドキュメントの先頭にBOMを付加している
- ISO-10646-UCS-2を使用している場合は,ビッグエンディアンのISO-10646-UCS-2を使用している
- 文字エンコーディングの指定方法
JSPドキュメントに使用する文字エンコーディングは,XML宣言のencoding属性に指定します。指定できる文字列は,Cosminexus XML Processorがサポートしている文字エンコーディング※です。
ただし,拡張子がjspxでないJSPドキュメントについては,web.xmlの<jsp-property-group>要素内の<is-xml>要素が指定されていない場合,次に示す方法のどれか一つ以上の方法で使用する文字エンコーディングを指定します。
- XML宣言のencoding属性に指定する。
- web.xmlの<jsp-property-group>要素内の<page-encoding>要素に指定する。
- pageディレクティブのpageEncoding属性に指定する。
指定できる文字列は,java.nio API用の正準名とjava.lang API用の正準名に記載されている文字エンコーディング,およびそれらの別名になります。
なお,指定する文字エンコーディングと,JSPドキュメントで使用する文字エンコーディングは,必ず一致するようにしてください。
注※ Cosminexus XML Processorがサポートしている文字エンコーディングについては,マニュアル「Cosminexus XML Processor ユーザーズガイド」の「1.3.2 処理できる文字コード」を参照してください。
(c) JSPドキュメントの場合(Servlet 2.3仕様に準拠したWebアプリケーションの場合)
Servlet 2.3仕様に準拠したWebアプリケーション内のJSPドキュメントで使用できる文字エンコーディングと,使用する文字エンコーディングの指定方法について次に示します。
- JSPドキュメントで使用できる文字エンコーディング
Cosminexus XML Processorがサポートしている文字エンコーディングが使用できます。Cosminexus XML Processorがサポートしている文字エンコーディングについては,マニュアル「Cosminexus XML Processor ユーザーズガイド」の「1.3.2 処理できる文字コード」を参照してください。
ただし,UTF-16などの英数字が複数バイトで表現される文字エンコーディングは使用できません。
- 文字エンコーディングの指定方法
JSPドキュメントに使用する文字エンコーディングは,次に示す方法の両方またはどちらかを選択して指定できます。
- XML宣言のencoding属性に指定する。
- pageディレクティブのpageEncoding属性に指定する。
指定できる文字列は,java.nio API用の正準名とjava.lang API用の正準名に記載されている文字エンコーディング,およびそれらの別名になります。
なお,指定する文字エンコーディングと,JSPドキュメントで使用する文字エンコーディングは,必ず一致するようにしてください。
(d) 標準シンタックスのタグファイルの場合
標準シンタックスのタグファイルで使用できる文字エンコーディングと,使用する文字エンコーディングの指定方法について次に示します。
- タグファイルで使用できる文字エンコーディング
JavaVMがサポートしている文字エンコーディングが使用できます。JavaVMがサポートしている文字エンコーディングについては,JDKのドキュメントを参照してください。
ただし,UTF-16などの英数字が複数バイトで表現される文字エンコーディングについては,タグファイルの先頭にBOMを付加する必要があります。
- 文字エンコーディングの指定方法
タグファイルに使用する文字エンコーディングは,次に示す方法の両方またはどちらかを選択して指定できます。
- タグファイルの先頭にBOMを付加する(Servlet 2.5/JSP 2.1仕様以降に準拠したWebアプリケーションの場合)。
- tagディレクティブのpageEncoding属性に指定する(Servlet 2.4/JSP 2.0仕様以降に準拠したWebアプリケーションの場合)。
指定できる文字列は,java.nio API用の正準名とjava.lang API用の正準名に記載されている文字エンコーディング,およびそれらの別名になります。
なお,指定する文字エンコーディングとタグファイルで使用する文字エンコーディングは,必ず一致するようにしてください。
(e) XMLシンタックスのタグファイルの場合
XMLシンタックスのタグファイルで使用できる文字エンコーディングと,使用する文字エンコーディングの指定方法を示します。
- タグファイルで使用できる文字エンコーディング
Cosminexus XML Processorがサポートしている文字エンコーディング※が使用できます。
- 文字エンコーディングの指定方法
タグファイルに使用する文字エンコーディングは,XML1.0仕様に従って指定してください。指定できる文字列は,Cosminexus XML Processorがサポートしている文字エンコーディング※です。
なお,指定する文字エンコーディングとタグファイルで使用する文字エンコーディングは,必ず一致するようにしてください。
注※ Cosminexus XML Processorがサポートしている文字エンコーディングについては,マニュアル「Cosminexus XML Processor ユーザーズガイド」の「1.3.2 処理できる文字コード」を参照してください。
(f) デフォルトの文字エンコーディング
JSPファイル,またはタグファイルに文字エンコーディングを明示的に指定しない場合,デフォルトの文字エンコーディングでJSPを処理します。
なお,この場合も,デフォルトの文字エンコーディングと,タグファイルで使用する文字エンコーディングは,必ず一致するようにしてください。デフォルトの文字エンコーディングについて,ServletおよびJSPの仕様ごとに次の表に示します。
表5-20 デフォルトの文字エンコーディング
仕様 | JSPページ | JSPドキュメント | 標準シンタックスのタグファイル | XMLシンタックスのタグファイル |
---|
Servlet 2.2/ JSP1.1 | ISO-8859-1 | ISO-8859-1 | - | - |
Servlet 2.3/ JSP 1.2 | ISO-8859-1 | ISO-8859-1 | - | - |
Servlet 2.4/ JSP 2.0 | ISO-8859-1 | UTF-8 | ISO-8859-1 | UTF-8 |
Servlet 2.5/ JSP 2.1 | ISO-8859-1 | UTF-8 | ISO-8859-1 | UTF-8 |
(凡例)-:該当しない
デフォルトの文字エンコーディングは,デフォルトの文字エンコーディング設定機能を使用しても設定できます。詳細については,「2.6 デフォルトの文字エンコーディング設定機能」を参照してください。