質問

このテストは、 Sun javaフォーラムの質問

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

私がテストしているコード: 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>

およびタグファイル:

<%-- /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
こちら わずかな変更-JSPでの呼び出しに合わせて、タグファイルの名前をsimpletag.tagからsimpleTag.tagに変更しました。
また、仕様のPDFからコピーしてみました(必要に応じて引用符を調整します)-同じ結果です。

ページを実行すると、標準の500エラーが発生します 根本的な原因: java.lang.ClassCastException:java.io.StringReader     org.apache.jsp.tagVariableTest_jsp._jspService(tagVariableTest_jsp.java:62)

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

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

誰かが私を正しい方向に向けてくれますか? コード/セットアップの何が問題になっていますか? これは既知の問題ですか? Googleで検索しましたが、何も見つからなかったようです。

ありがとう、 evnafets


解像度での編集: ClassCastExceptionは、タグ内の行によって引き起こされていました:

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

前述のとおりこちら varReader属性は、保存する属性を指定しますStringReaderとしての評価結果。この例外は、「var1」の値を取得しようとするTomcat生成コードが原因で発生しました。それを文字列にキャストします。 StringはStringReaderではないため、その時点で例外が発生しました。

コーディングエラーが「var」を使用したはずかどうかはわかりません。 &var; varReader&quot;の代わりにまたは、どちらも使用してはならず、そのまま評価する必要があります。 その属性を完全に削除するとフラグメントが完全に出力され、次に本文に&var; var1&quot;の値が含まれます:

  

フラグメントテンプレートテキスト30。   本文を呼び出す:AT_BEGINスクリプト変数30を定義するタグの本文

属性var =&quot; var1&quot;の作成フラグメントを実行し、結果をvar1に保存します。次に、この新しいvar1の値を使用して本体が評価され、次の結果になります。

  

本文を呼び出す:AT_BEGINスクリプト変数Fragment Template Text 30を定義するタグの本文

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

役に立ちましたか?

解決

構文リファレンスから、varまたはvarReaderは

です
  

フラグメント呼び出しの結果を保存するスコープ属性の名前

サンプルコードにエラーが含まれているのではないかと思います。 jsp:invokeの結果を直接ページに書き込む必要がある場合、それを変数に割り当てる必要はありません。

&quot; varReader&quot;を省いてみてください。属性?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top