此测试是通过阅读 Sun java论坛上的一个问题来提示的

a>并且我想我会尝试一下。 JSP2.0规范部分JSP.13.8包含“Example Simple Tag Handler Scenario”。我复制并粘贴代码片段并尝试运行它。

环境: 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的一部分提供
这里 做了一些小改动 - 我将标签文件的名称从simpletag.tag更改为simpleTag.tag,以匹配JSP中对它的调用。
我也尝试从规范的PDF中复制(根据需要调整引号) - 结果相同。

当我执行页面时,我最终遇到标准500错误 根本原因: java.lang.ClassCastException:java.io.StringReader     org.apache.jsp.tagVariableTest_jsp._jspService(tagVariableTest_jsp.java:62)

生成的JSP的第62行结果是:     var1 =(java.lang.String)_jspx_page_context.findAttribute(&quot; var1&quot;);

好的,我可以理解ClassCastException - 它认为var1应该是一个String,而实际的属性是StringReader。但为什么它是StringReader呢?变量在哪里创建?为什么要尝试完成这项任务呢?

有人可以指出我正确的方向吗? 代码/设置有什么问题? 这是一个已知的问题?我用谷歌搜索但似乎找不到任何东西。

谢谢, evnafets


使用分辨率编辑: ClassCastException是由标记中的行引起的:

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

此处所述,varReader属性指定要存储的属性评估结果为StringReader。该异常是由Tomcat生成的代码试图检索“var1”的值引起的。并将其转换为String。由于String不是StringReader所以它在那时引发了异常。

我不确定编码错误是否应该使用“var”。而不是“varReader”属性,或者他们不应该使用任何一个,只是按原样评估它。 删除该属性会完全打印出片段,然后打印出值为“var1”的正文:

  

片段模板文字30。   调用正文:定义AT_BEGIN脚本变量30的标记正文

使属性var =&quot; var1&quot;执行片段,并将结果存储到var1。然后使用var1的这个新值计算正文,结果为:

  

调用正文:定义AT_BEGIN脚本变量的标记正文片段模板文本30

我个人认为第一种情况更有意义,但这段代码是作为内部工作的一个例子,而不是最佳实践。
我仍然希望在任何情况下编译/运行该示例。如果没有,我会感到非常惊讶。

有帮助吗?

解决方案

语法参考中,您可以看到var或varReader是

  

用于在

中存储片段调用结果的作用域属性的名称

所以我担心示例代码包含错误。如果需要将jsp:invoke的结果直接写入页面,则不需要将其分配给var。

你可以尝试省略“varReader”吗?属性?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top