<jsp:useBean>タグでは,class属性はオブジェクトの実装クラス名であることがJSPの仕様で定義されています。07-00以降では,この仕様に準拠して,JSPトランスレーション時に,class属性に指定されたクラスについて次のチェックを実施しています。
- クラスの修飾子がpublicである。
- クラスの修飾子がinterfaceではない。
- クラスの修飾子がabstractではない。
- メソッドの修飾子がpublicで引数がないコンストラクタが存在する。
このため,class属性にこれらのチェック項目に該当しないクラスを指定したとき,07-00より前と07-00以降ではJSPコンパイルの結果が異なります。
次のようにinclude元で実装クラスを指定して,include先でインタフェースを指定したJSPを例にして説明します。
- test1.jsp(インクルード元)
<jsp:useBean id="bean" scope="request" class="test.TestBean"/>
<jsp:include page="test1_included.jsp"/>
|
- test1_included.jsp(インクルード先)
<jsp:useBean id="bean" scope="request" class="test.TestBeanIF"/>
|
- 注 class属性に指定したtest.TestBeanはJSP仕様に準拠した実装クラス,test.TestBeanIFはtest.TestBeanのインタフェースになります。
この定義例での,Cosminexusのバージョンごとの動作を次に示します。
- 07-00より前のバーションの場合
JSPトランスレーション時にチェックを実施しないため,JSPファイルから生成されたサーブレットが実行されます。
JSPファイルから生成されたサーブレットでは,id属性に指定された"bean"で既存のスクリプト変数を検索します。上記ではインクルード元(test1.jsp)ですでに同一スクリプト変数が定義済みのため,class属性で指定されたクラス(test.TestBeanIFインタフェース)からのインスタンス化はしないで,既存のオブジェクト(test.TestBeanクラスのインスタンス)を使用します。そのため,正常に実行されます。
- 07-00以降のバージョンの場合
test1_included.jspは,JSPトランスレーション時にclass属性に指定されたクラスのチェックを実施するため,JSPトランスレーションでエラーとなります。
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.