Java JSP.13.8示例简单标记处理程序场景不';不行?

Java JSP.13.8示例简单标记处理程序场景不';不行?,java,jsp,tomcat,jsp-tags,Java,Jsp,Tomcat,Jsp Tags,这个测试是由阅读引起的,我想我会尝试一下。 JSP2.0规范部分JSP.13.8包含一个“示例简单标记处理程序场景”。我复制并粘贴了代码片段,并试图运行它 环境: ApacheTomcat版本5.5.26和6.0.14(在这两个版本上都进行了测试) Java:1.5 我正在测试的代码: Jsp页面: <%@ taglib prefix="my" tagdir="/WEB-INF/tags" %> <my:simpletag x="10"> <jsp:attribut

这个测试是由阅读引起的,我想我会尝试一下。 JSP2.0规范部分JSP.13.8包含一个“示例简单标记处理程序场景”。我复制并粘贴了代码片段,并试图运行它

环境: ApacheTomcat版本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>

20
非碎片模板文本
片段模板文本${var1}
定义起始位置的标记体
脚本变量${var1}。
和标记文件:

<%-- /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\u jsp.\u jsp服务(tagVariableTest\u jsp.java:62)

生成的JSP的第62行是: var1=(java.lang.String)_jspx_page_context.findAttribute(“var1”)

好的,我可以理解ClassCastException——它认为var1应该是一个字符串,而实际的属性是一个StringReader。但为什么它是StringReader?变量是在哪里创建的?为什么它要做这个任务呢

有人能给我指一下正确的方向吗? 代码/设置有什么问题? 这是一个已知的问题吗?我在谷歌上搜索了一下,但似乎什么也没找到

谢谢, 埃夫纳菲茨


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

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

如前所述,varReader属性指定将评估结果存储为StringReader的属性。异常是由Tomcat生成的代码试图检索“var1”的值并将其转换为字符串引起的。由于字符串不是StringReader,因此在该点上引发了异常

我不确定编码错误是否是他们应该使用“var”而不是“varReader”属性,或者他们不应该使用这两个属性,只是按原样对其进行评估。 删除该属性将完全打印出片段,然后打印出值为“var1”的主体:

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

使属性var=“var1”执行片段,并将结果存储到var1。然后使用var1的新值对主体进行评估,结果是:

调用body:body标签,该标签定义AT_BEGIN脚本变量片段模板文本30

就我个人而言,我认为第一种情况更有意义,但这段代码只是作为内部工作的示例,而不是最佳实践。
我仍然希望该示例在任何情况下都能编译/运行。当它没有出现时,我相当惊讶。

从中,您可以看到var或varReader是

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

因此,恐怕示例代码包含错误。如果需要将jsp:invoke的结果直接写入页面,则无需将其分配给var


你能试着省去“varReader”属性吗?

100%正确。省略varReader属性解决了这个问题。然后,代码抛出一个ClassCastException:java.lang.Long。由于EL表达式中的添加导致了长时间的错误,因此更容易跟踪/修复该错误。将其转换为字符串是有效的。