ここでは,JSPのカスタムタグで,スクリプト変数を定義する場合の注意事項について説明します。
●スコープ指定時の注意
複数のカスタムタグで,スクリプト変数名とスクリプト変数のスコープが重複した場合,Cosminexusのバージョンによって,JSPのコンパイル結果が異なります。スクリプト変数のスコープは,次のどちらかで指定します。
- javax.servlet.jsp.tagext.TagExtraInfoクラスのサブクラス
- TLDファイルのvariable要素内のscope要素
JSPのカスタムタグで同じ名称のスクリプト変数を指定した場合に,Cosminexusのバージョンごとの動作の違いを次に示します。
- 07-00より前のバーションの場合
2回目以降のカスタムタグに対応するJSPから生成されたJavaコードでも,スクリプト変数の変数宣言を行います。
- 07-00以降のバージョンの場合
2回目以降のカスタムタグに対応するJSPから生成されたJavaコードでは,スクリプト変数の変数宣言を行いません。
スコープが「AT_BEGIN」で,属性idに指定された変数名(var)のスクリプト変数を定義するカスタムタグ<my:foo>を例に説明します。
- 定義例
<my:foo id="var" type="String">
<%=var%>
</my:foo>
<my:foo id="var" type="String">
<%=var%>
</my:foo>
|
- 07-00より前のバーションの場合
2回目のカスタムタグに対応するJSPから生成されたJavaコードでも,スクリプト変数varで変数宣言をします。この場合,各カスタムタグでのスコープ「AT_BEGIN」の範囲は次のようになります。
このため,JSPから生成されたJavaソースのコンパイル時にコンパイルエラーとなります。
- 07-00以降のバージョンの場合
2回目のカスタムタグに対応するJSPから生成されたJavaコードでは,スクリプト変数varで変数宣言をしません。この場合,各カスタムタグでのスコープ「AT_BEGIN」の範囲は次のようになります。
このため,同一スコープ内で同一の名称のスクリプト変数を定義しても,JSPから生成されたJavaソースのコンパイルは正常に実行されます。
●スクリプトレット記述時の注意
JSPからJavaソースを生成する際,スクリプトレットで記述されたJavaコードは解析しません。このため,カスタムタグの前後,またはボディのスクリプトレットで,スクリプト変数のスコープが変更される処理を定義していると,Cosminexusのバージョンによっては,JSPコンパイルの結果がエラーとなることがあります。
- スコープが「AT_BEGIN」の場合にコンパイルエラーとなる例
この例では,カスタムタグ<my:foo>で,スコープに「AT_BEGIN」,属性idに指定された変数名(var)のスクリプト変数を定義しています。
<% if(flag) { %>
<my:foo id="var" type="String">
<%=var%>
</my:foo>
<% } else { %>
<my:foo id="var" type="String">
<%=var%>
</my:foo>
<% } %>
|
この定義例での,Cosminexusのバージョンごとの動作を次に示します。
- 07-00より前のバーションの場合
2回目のカスタムタグに対応するJSPから生成されたJavaコードでも,スクリプト変数varで変数宣言をします。このため,2回目のスクリプト変数varの参照でもエラーとなりません。JSPコンパイルは正常に実行されます。
- 07-00以降のバージョンの場合
2回目のカスタムタグでは,スクリプト変数varが宣言済みと解析します。この場合,カスタムタグに対応するJSPから生成されたJavaコードでは,変数varで変数宣言をしません。このため,2回目のスクリプト変数varの参照でエラーとなります。
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.