Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)


8.2.6 JSP実装時の注意事項

JSPを実装するときの注意事項を示します。

〈この項の構成〉

(1) includeディレクティブ利用時の注意

(2) タグライブラリ利用時の注意

(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が重複した場合は,次に示す番号順を優先順位とし,優先順位の高いマッピングが有効になります。

  1. JSTLおよびJSFのURIの暗黙マッピング(Servlet 2.5仕様以降のWebアプリケーション)

  2. web.xmlの<taglib>要素の<taglib-uri>要素で指定したURIと,<taglib-location>要素で指定したTLDファイルのマッピング

  3. Webアプリケーション内のTLDファイルの<uri>要素で指定したURIと,そのTLDファイル自身のマッピング

  4. ライブラリ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.の場合のディレクトリ構成の例を次に示します。

図8‒3 ディレクトリ構成(2.の場合)

[図データ]

このディレクトリ構成の場合のtaglibディレクティブのuri属性で指定するURIとTLDファイルのマッピングを次の図に示します。

図8‒4 URIとTLDファイルのマッピング(2.の場合)

[図データ]

図中のデータの対応について説明します。

  1. タグのプリフィックスにtaglibディレクティブで指定したプリフィックスを指定します。

  2. TLDファイルの<name>要素で指定した値を,JSPファイルのプリフィックスと対応づけます。

  3. web.xmlの<taglib-uri>要素で,JSPファイルのtaglibディレクティブで指定したuriを指定します。

  4. web.xmlの<taglib-location>要素で,マッピングするTLDファイル名を指定します。

(b) TLDファイルの<uri>要素で指定したURIと,そのTLDファイル自身をマッピングする場合

3.または4の場合のディレクトリ構成とファイルの記述例について説明します。

3.の場合,TLDファイルはWebアプリケーション内に格納されています。3.の場合のディレクトリ構成の例を次に示します。

図8‒5 ディレクトリ構成(3.の場合)

[図データ]

4.の場合,TLDファイルはライブラリJARの/META-INFディレクトリ以下に格納されています。4.の場合のディレクトリ構成の例を次に示します。

図8‒6 ディレクトリ構成(4.の場合)

[図データ]

3.または4.の場合のディレクトリ構成でのtaglibディレクティブのuri属性で指定するURIとTLDファイルのマッピングを次の図に示します。

図8‒7 TLDファイルの<uri>要素で指定したURIと,そのTLDファイル自身のマッピング(3.または4.の場合)

[図データ]

図中のデータの対応について説明します。

  1. タグのプリフィックスにtaglibディレクティブで指定したプリフィックスを指定します。

  2. TLDファイルの<name>要素で指定した値を,JSPファイルのプリフィックスと対応づけます。

  3. TLDファイルの<url>要素で,JSPファイルのtaglibディレクティブで指定したuriを指定します。

URIの重複が検出された場合,次のメッセージがWebアプリケーション単位で出力され,該当するマッピングは無視されます。

表8‒20 URI重複時に出力されるメッセージと出力条件

メッセージID

出力条件

KDJE39314-W

TLDファイルで記述した<uri>要素の内容が,web.xmlの<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ファイルのバージョンに関する注意事項

JSPトランスレーション時にTLDファイルのバージョン(TLDファイルが対応するJSPのバージョン)をチェックします。そのため,TLDファイルのバージョンが,Webアプリケーションのバージョンに対応しているJSPおよびTLDファイルのバージョンより上位のJSPの場合,JSPトランスレーションでエラーになります。また,JSP 1.2,およびJSP 2.0仕様以降では,TLDファイルにスキーマ言語を定義する必要があります。

TLDファイルのバージョンは,TLDファイルに記述されたスキーマ言語から判定します。ただし,スキーマ言語が定義されていない場合は,Webアプリケーションのバージョンから判定します。

TLDファイルにスキーマ言語を定義していない場合のTLDファイルのバージョンを次の表に示します。

表8‒21 スキーマ言語未定義時の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ドキュメントで使用できる文字エンコーディング

    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属性に指定します。指定できる文字列は,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ドキュメントで使用する文字エンコーディングは,必ず一致するようにしてください。

注※ XML Processorがサポートしている文字エンコーディングについては,マニュアル「XML Processor ユーザーズガイド」の「1.3.2 処理できる文字コード」を参照してください。

(c) JSPドキュメントの場合(Servlet 2.3仕様に準拠したWebアプリケーションの場合)

Servlet 2.3仕様に準拠したWebアプリケーション内のJSPドキュメントで使用できる文字エンコーディングと,使用する文字エンコーディングの指定方法について次に示します。

  • JSPドキュメントで使用できる文字エンコーディング

    XML Processorがサポートしている文字エンコーディングが使用できます。XML Processorがサポートしている文字エンコーディングについては,マニュアル「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シンタックスのタグファイルで使用できる文字エンコーディングと,使用する文字エンコーディングの指定方法を示します。

  • タグファイルで使用できる文字エンコーディング

    XML Processorがサポートしている文字エンコーディングが使用できます。

  • 文字エンコーディングの指定方法

    タグファイルに使用する文字エンコーディングは,XML1.0仕様に従って指定してください。指定できる文字列は,XML Processorがサポートしている文字エンコーディングです。

    なお,指定する文字エンコーディングとタグファイルで使用する文字エンコーディングは,必ず一致するようにしてください。

注※ XML Processorがサポートしている文字エンコーディングについては,マニュアル「XML Processor ユーザーズガイド」の「1.3.2 処理できる文字コード」を参照してください。

(f) デフォルトの文字エンコーディング

JSPファイル,またはタグファイルに文字エンコーディングを明示的に指定しない場合,デフォルトの文字エンコーディングでJSPを処理します。

なお,この場合も,デフォルトの文字エンコーディングと,タグファイルで使用する文字エンコーディングは,必ず一致するようにしてください。デフォルトの文字エンコーディングについて,ServletおよびJSPの仕様ごとに次の表に示します。

表8‒22 デフォルトの文字エンコーディング

仕様

JSPページ

JSPドキュメント

標準シンタックスのタグファイル

XMLシンタックスのタグファイル

Servlet 2.2/ JSP 1.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,JSP 2.1,JSP 2.2,JSP 2.3

ISO-8859-1

UTF-8

ISO-8859-1

UTF-8

(凡例)−:該当しない

デフォルトの文字エンコーディングは,デフォルトの文字エンコーディング設定機能を使用しても設定できます。詳細については,「2.6 デフォルトの文字エンコーディング設定機能」を参照してください。

(14) setPropertyアクション使用時の注意事項

JSPページでのsetPropertyアクション,またはJSPドキュメントでの<jsp:setProperty>タグのname属性に,不正な値を指定しないでください。<jsp:setProperty>タグのname属性に不正な値を指定した場合の動作は保証されません。

(15) JSPのタグの属性への空文字列の指定について

JSPページのディレクティブやアクションのタグ,およびJSPドキュメントの「jsp:」で始まるタグの属性に空文字列を指定しないでください。

(16) JSPのテンプレートテキストの前後にスクリプトレットを記述する場合の注意

JSPのテンプレートテキストの前後にif文などの制御文を含むスクリプトレットを記載する場合は,明示的に"{}"(中括弧)で囲む必要があります。

JSPコンパイルの結果,1行のJSPのテンプレートテキストがJavaファイルでも1行のステートメントとなるとは限りません。複数行のステートメントとして出力される可能性があります。そのため,テンプレートテキストの前後のスクリプトレットでif文などの制御文を明示的に"{}"(中括弧)で囲んでいない場合は,意図しない動作となるおそれがあります。

(17) スクリプトレット使用時の注意

JSPでスクリプトレットを使用してjavaコードを記述する場合に,スクリプトレットにreturn文またはthrow文を記述するときは,if文などのブロック内に記述するようにしてください。

(18) ELが無効な場合のトランスレーションエラーについて

JSP内に"${aaa"のようにELとして不正な文字列を含む場合,ELを無効に設定しても,EL不正のトランスレーションエラーが発生します。

JSP仕様のバージョンごとに,トランスレーションエラーが発生するEL開始文字を次の表に示します。

表8‒23 トランスレーションエラーが発生するEL開始文字

JSP仕様のバージョン

EL開始文字

JSP 2.1以降

'$','#'

JSP 2.0

'$'

JSP 1.2

なし

(19) TLDファイルのschemaLocationの記載について

TLDファイルに記述するschemaLocationは,TLDのバージョンに応じて,次の表に示すどちらかの値を指定する必要があります。

TLDのバージョン

schemaLocationに指定する値

2.0

"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

2.1

"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"