2009-03-09 5 views
0

このテストでは、a question on the Sun java forumsを読んでプロンプトが表示され、試してみると思います。 JSP2.0仕様のセクションJSP.13.8には、「シンプルタグハンドラシナリオの例」が含まれています。コードフラグメントをコピーして貼り付け、それを実行しようとしました。JSP.13.8 Example Simple Tag Handlerのシナリオが機能しません。

環境: のApache Tomcatバージョン5.5.26および6.0.14(両方でテスト) のJava: JSPページ:

<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %> 
<my:simpletag x="10"> 
<jsp:attribute name="y">20</jsp:attribute> 
<jsp:attribute name="nonfragment"> 
Nonfragment Template Text 
</jsp:attribute> 
<jsp:attribute name="frag"> 
Fragment Template Text ${var1} 
</jsp:attribute> 
<jsp:body> 
Body of tag that defines an AT_BEGIN 
scripting variable ${var1}. 
</jsp:body> 
</my:simpletag> 

とタグ私がテストしてい1.5

コードファイル:

<%-- /WEB-INF/tags/simpleTag.tag --%> 
<%@ attribute name="x" %> 
<%@ attribute name="y" %> 
<%@ attribute name="nonfragment" %> 
<%@ attribute name="frag" fragment="true" %> 
<%@ variable name-given="var1" scope="AT_BEGIN" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
Some template text. 
<c:set var="var1" value="${x+y}"/> 
<jsp:invoke fragment="frag" varReader="var1"/> 
Invoke the body: 
<jsp:doBody/> 

このコードは、JSP2.0仕様のPDFコピーから直接コピーされています。
JSP-APIの一部としても利用可能here マイナーな変更 - JSPでの呼び出しに合わせて、タグファイルの名前をsimpletag.tagからsimpleTag.tagに変更しました。
私はまた、仕様のPDFからコピーを試みました(必要に応じて引用符を調整) - 同じ結果。

私は標準500エラー 根本原因で終わるページを実行します。 とjava.lang.ClassCastException:java.io.StringReader org.apache.jsp.tagVariableTest_jsp._jspService(tagVariableTest_jsp.java:62を)

生成されたJSPのLine62は、次のようになります。 var1 =(java.lang.String)_jspx_page_context.findAttribute( "var1");

私はClassCastExceptionを理解できます。var1はStringで、実際の属性はStringReaderである必要があります。しかし、なぜそれはStringReaderですか?変数はどこで作成されましたか?そして、なぜこの任務をやろうとしているのですか?

誰かが正しい方向に向けることができますか? コード/セットアップの問題点は何ですか? これは既知の問題ですか?私はそれをgoogledしかし、何かを見つけるように見えなかった。

おかげで、解像度と evnafets


編集:

<jsp:invoke fragment="frag" varReader="var1"/> 

としてはvarReader属性を格納するための属性を指定しhere述べた: にClassCastExceptionがタグ内の行によって引き起こされていました評価結果をStringReaderとして返します。例外はTomcat生成コードが "var1"の値を取り出して文字列にキャストしようとしたために発生しました。 StringはStringReaderではないので、その時点で例外が発生しました。

「varReader」属性の代わりに「var」を使用する必要があるかどうか、またはどちらも使用していないようにして、そのまま評価するべきかどうかはわかりません。 その属性を削除すると、断片と完全な値の両方が "var1"の値で出力されます。

フラグメントテンプレートテキスト30。 は、本体を起動:属性varが=「VAR1」作る変数30

AT_BEGINスクリプトを定義するタグの本体は、断片を実行し、VAR1に結果を格納します。身体を起動

:体は、その後に結果VAR1のこの新しい値で評価されたタグのボディは、AT_BEGINスクリプト変数フラグメントテンプレートテキストを定義する30

個人的に私は、最初のケースを作ると思いますもっと意味がありますが、このコードは、ベストプラクティスではなく、内部の仕事の例として提示されています。
私はまだ例がコンパイル/実行することを期待していました。私はそれがしなかったときかなり驚いた。

答えて

2

syntax referenceあなたはVARやvarReaderどちらかがだから私は恐れてのサンプルコードだ

にフラグメントの呼び出しの結果を格納するためにスコープ属性の名前

であることがわかりますから、エラーが含まれています。 jsp:invokeの結果をページに直接書き込む必要がある場合は、それをvarに割り当てる必要はありません。

"varReader"属性を残してみることはできますか?

+0

100%正しい。 varReader属性を残しておくと、その問題が解決されました。 その後、コードはClassCastExceptionをスローしました:java.lang.Long。 EL式での追加がLongになっているので、それはより簡単に追跡/修正されます。それを文字列に変換しました。 – evnafets

関連する問題