2.3 JSP の実行機能
2.3.5 カスタムタグの属性名チェック
カスタムタグの属性名チェック時に,次の属性名で大文字と小文字が一致しない場合,トランスレーション エラーが発生します。
• JSP のカスタムタグで指定した属性名
• TLD ファイルまたはタグファイルで定義した属性名
アプリケーションサーバでは,カスタムタグの属性名チェック時に,大文字と小文字の不一致によるトラン スレーションエラーの発生を抑止できます。大文字と小文字の不一致によるトランスレーションエラーの 発生を抑止すると,TLD ファイルまたはタグファイルに定義されている属性名から,大文字と小文字を区 別しないでカスタムタグの属性定義が検索されます。
TLD ファイルおよびタグファイルの属性名を定義する個所は次のとおりです。
• TLD ファイルの<taglib><tag><attribute>要素内の<name>要素で定義した属性名
• タグファイルの attribute ディレクティブで定義した属性名
(1) カスタムタグの属性名チェックを無効にする方法
カスタムタグの属性名チェック時に大文字と小文字の不一致によるトランスレーションエラーの発生を抑 止するには,次の二つの方法があります。
• 簡易構築定義ファイルの論理 J2EE サーバ(j2ee-server)の<configuration>タグ内でパラメタ webserver.jsp.translation.customAction.ignoreCaseAttributeName に true を指定します。
簡易構築定義ファイル,および指定するパラメタの詳細については,マニュアル「アプリケーション サーバ リファレンス 定義編(サーバ定義)」の「4.6 簡易構築定義ファイル」を参照してください。
• cjjspc コマンドに-usebeannocheckduplicateid オプションを指定してコンパイルします。
コマンドの詳細については,マニュアル「アプリケーションサーバ リファレンス コマンド編」の「cjjspc
(JSP の事前コンパイル)」を参照してください。
(2) 注意事項
大文字と小文字だけで区別されている属性がある場合に,大文字と小文字の不一致によるトランスレーショ ンエラーの発生を抑止しないでください。抑止すると,次の問題が発生します。
• 大文字と小文字だけで区別されている複数の属性を JSP のカスタムタグで指定している場合
それぞれの属性に対してタグハンドラの setter メソッドが実行されます。このとき,同一の属性が複数 個指定されていても,トランスレーションエラーは発生しません。このため,複数個の同一の属性に対 して setter メソッドが実行されてしまうおそれがあります。
• 大文字と小文字だけで区別されている属性名に対応したタグハンドラを実装している場合
大文字と小文字の区別なく,TLD ファイルまたはタグファイルで先に記述された属性の setter メソッ ドが呼び出されます。このとき,トランスレーションエラーは発生しません。このため,意図した setter メソッドを呼び出すことができなくなるおそれがあります。
2.3.6 <jsp:useBean>タグの id 属性重複チェック
JSP 仕様では,<jsp:useBean>タグの id 属性値が重複していた場合,トランスレーションエラーが発生し て JSP のコンパイルに失敗します。
アプリケーションサーバでは,<jsp:useBean>タグの id 属性値の重複によるトランスレーションエラーの 発生を抑止して,JSP をコンパイルできます。
<jsp:useBean>タグの id 属性値の重複によるトランスレーションエラーの発生を抑止した場合,次の JSP ファイルの記述例のように<jsp:useBean>タグの id 属性値が重複していても,JSP が問題なく動作しま す。
JSP ファイルの記述例
(省略)
:
<% if (条件式){ %>
<jsp:useBean id=”BeanTest” class=”test.TestClass1” />
<% } else { %>
<jsp:useBean id=”BeanTest” class=”test.TestClass2” />
<% } %>
:
(省略)
スクリプトレットを使用して,if 節と else 節にそれぞれ<jsp:useBean>タグを記述することで,片方の<jsp:useBean>
タグしか実行されません。そのため,<jsp:useBean>タグの id 属性値が重複していても JSP は問題なく動作します。
<jsp:useBean>タグの id 属性値の重複によるトランスレーションエラーの発生を抑止している場合に,
<jsp:useBean>タグの id 属性値が重複したときは,KDJE39544-I のメッセージが出力されます。
(1) <jsp:useBean>タグの id 属性重複チェックを有効にする方法
<jsp:useBean>タグの id 属性値の重複によるトランスレーションエラーの発生を抑止するには,次の二つ の方法があります。
• 簡易構築定義ファイルの論理 J2EE サーバ(j2ee-server)の<configuration>タグ内でパラメタ webserver.jsp.translation.useBean.noCheckDuplicateId に true を指定します。
簡易構築定義ファイル,および指定するパラメタの詳細については,マニュアル「アプリケーション サーバ リファレンス 定義編(サーバ定義)」の「4.6 簡易構築定義ファイル」を参照してください。
• cjjspc コマンドに-usebeannocheckduplicateid オプションを指定してコンパイルします。
コマンドの詳細については,マニュアル「アプリケーションサーバ リファレンス コマンド編」の「cjjspc
(JSP の事前コンパイル)」を参照してください。
(2) 注意事項
<jsp:useBean>タグで作成された JavaBeans オブジェクトは,id 属性値をキーにして,scope 属性で指 定されたスコープ内で管理されます。そのため,次の条件を満たす場合に,意図しない JavaBeans オブ ジェクトを取得して不正な動作となるおそれがあります。
• <jsp:useBean>タグの id 属性値の重複によるトランスレーションエラーの発生を抑止している。
• <jsp:useBean>タグの id 属性値が重複している。
• id 属性値が重複している二つ以上の<jsp:useBean>タグの class 属性に,異なる JavaBeans クラスを 指定している。
<jsp:useBean>タグの id 属性値の重複によるトランスレーションエラーの発生を抑止している場合に,意 図したオブジェクトが取得できないおそれがある JSP ファイルの記述例について説明します。
(a) 単一のリクエストで意図しない JavaBeans オブジェクトが取得される場合の JSP ファイルの記述例(二 つ以上の異なる条件式で同じ id 属性を指定した例)
(省略)
:
<% if (条件式1){ %>
<jsp:useBean id="BeanTest" class="test.TestClass1" scope="page"/>
<% } %>
<% if(条件式2) { %>
<jsp:useBean id="BeanTest" class="test.TestClass2" type="test.TestIF" scope="page"/>
<% } %>
:
(省略)
条件式 1 と条件式 2 で,id 属性値に同じ値(BeanTest)が指定されています。条件式 1 および条件式 2 の両方の条件を満たす場合,一つ目の<jsp:useBean>タグでも二つ目の<jsp:useBean>タグでも test.TestClass1 クラスのオブジェクトが取得され,test.TestClass2 クラスのオブジェクトは取得されま せん。
一つ目の<jsp:useBean>タグで id 属性値「BeanTest」に対して test.TestClass1 クラスのオブジェクト が登録されます。二つ目の<jsp:useBean>タグでも同じ id 属性値「BeanTest」に対しての処理であると 解釈されるため,一つ目の<jsp:useBean>タグで登録済みの test.TestClass1 クラスのオブジェクトが取 得されます。
(b) 複数のリクエストで意図しない JavaBeans オブジェクトが取得される場合の JSP ファイルの記述例 1(if 文と else 文で同じ id 属性値を指定した例)
(省略)
:
<% if (条件式){ %>
<jsp:useBean id="BeanTest" class="test.TestClass1" scope="session"/>
<% } else { %>
<jsp:useBean id="BeanTest" class="test.TestClass2" scope="session"/>
<% } %>
:
(省略)
if 文と else 文で,id 属性値に同じ値(BeanTest)が指定されています。リクエストを 2 回受け付けて,1 回目のリクエストでは if 文の条件式が成立し,2 回目のリクエストでは if 文の条件式が不成立となった場 合,一つ目の<jsp:useBean>タグと二つ目の<jsp:useBean>タグの両方で test.TestClass1 クラスのオブ ジェクトが取得され,test.TestClass2 クラスのオブジェクトは取得されません。
一つ目の<jsp:useBean>タグで id 属性値「BeanTest」に対して test.TestClass1 クラスのオブジェクト が登録されます。二つ目の<jsp:useBean>タグでも同じ id 属性値「BeanTest」に対しての処理であると 解釈されるため,一つ目の<jsp:useBean>タグで登録済みの test.TestClass1 クラスのオブジェクトが取 得されます。
(c) 複数のリクエストで意図しない JavaBeans オブジェクトが取得される場合の JSP ファイルの記述例 2
(<jsp:getProperty>タグまたは<jsp:setProperty>タグで,二つ以上の<jsp:useBean>タグで共通して 指定されている id 属性値を使用して JavaBeans オブジェクトを呼び出す例 1)
(省略)
:
<% if (条件式1){ %>
<jsp:useBean id=”BeanTest” class=”test.TestClass1” scope=”page”/>
<% } %>
<% if(条件式2) { %>
<jsp:useBean id=”BeanTest” class=”test.TestClass2” type=” test.TestIF” scope=”page”/>
<% } %>
:
<jsp:setProperty name=”BeanTest” property=”*”/>
:
<jsp:getProperty name=”BeanTest” property=”value”/>
:
(省略)
<jsp:getProperty>および<jsp:setProperty>タグで定義する処理では,<jsp:useBean>タグで作成され た JavaBeans オブジェクトを呼び出します。
異なる JavaBeans クラスを作成する二つ以上の<jsp:useBean>タグで id 属性値を重複させると,最後に 出現する<jsp:useBean>タグで指定されたオブジェクトが<jsp:getProperty>または<jsp:setProperty>
タグでの処理に使用されます。
例では,条件式 1 と条件式 2 で,id 属性値に同じ値(BeanTest)が指定されています。そのため,条件式 1 が成立する場合でも,一つ目の<jsp:useBean>タグで登録された test.TestClass1 クラスのオブジェク トは<jsp:getProperty>および<jsp:setProperty>タグでの処理に使用されません。
(d) 複数のリクエストで意図しない JavaBeans オブジェクトが取得される場合の JSP ファイルの記述例 3
(<jsp:getProperty>タグまたは<jsp:setProperty>タグで,二つ以上の<jsp:useBean>タグで共通して 指定されている id 属性値を使用して JavaBeans オブジェクトを呼び出す例 2)
(省略)
:
<% if (条件式1){ %>
<jsp:useBean id=”BeanTest” class=”test.TestClass1” scope=”page”/>
:
<jsp:setProperty name=”BeanTest” property=”*”/>
:
<jsp:getProperty name=”BeanTest” property=”value”/>
:
<% } %>
<% if(条件式2) { %>
<jsp:useBean id=”BeanTest” class=”test.TestClass2” type=” test.TestIF” scope=”page”/>
:
<jsp:setProperty name=”BeanTest” property=”*”/>
:
<jsp:getProperty name=”BeanTest” property=”value”/>
:
<% } %>
:
(省略)
<jsp:getProperty>および<jsp:setProperty>タグで定義する処理では,<jsp:useBean>タグで作成され た JavaBeans オブジェクトを呼び出します。
異なる JavaBeans クラスを作成する二つ以上の<jsp:useBean>タグで id 属性値を重複させると,最後に 出現する<jsp:useBean>タグで指定されたオブジェクトが<jsp:getProperty>または<jsp:setProperty>
タグでの処理に使用されます。
例では,条件式 1 と条件式 2 で,id 属性値に同じ値(BeanTest)が指定されています。そのため,条件式 1 が成立する場合でも,一つ目の<jsp:setProperty>タグでの処理に使用されるのは,二つ目の
<jsp:useBean>タグで登録された test.TestClass2 クラスのオブジェクトです。一つ目の
<jsp:useBean>タグで登録された test.TestClass1 クラスのオブジェクトは<jsp:getProperty>および
<jsp:setProperty>タグでの処理に使用されません。