这项测试是由阅读提示的
a question on the Sun java forums
我想我会试试看。
环境:
ApacheTomcat版本5.5.26和6.0.14(在这两个版本上都进行了测试)
我正在测试的代码:
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的一部分
here
我还尝试从规范的PDF中复制(根据需要调整引号)——结果相同。
当我执行这个页面时,我会出现一个标准的500错误
java.lang.ClassCastException:java.io.StringReader
org.apache.jsp.tagVariableTest\u jsp.\u jsp服务(tagVariableTest\u jsp.java:62)
var1=(java.lang.String)_jspx_page_context.findAttribute(“var1”);
好的,我可以理解ClassCastException——它认为var1应该是一个字符串,而实际的属性是一个StringReader。但为什么它是StringReader?变量是在哪里创建的?为什么它要做这个任务呢?
有人能给我指一下正确的方向吗?
代码/设置有什么问题?
这是一个已知的问题吗?我在谷歌上搜索了一下,但似乎什么也没找到。
谢谢
埃夫纳菲茨
分辨率编辑:
ClassCastException是由标记中的行引起的:
<jsp:invoke fragment="frag" varReader="var1"/>
如上所述
here
我不确定编码错误是否是他们应该使用“var”而不是“varReader”属性,或者他们不应该使用这两个属性,只是按原样对其进行评估。
删除该属性将完全打印出片段,然后打印出值为“var1”的主体:
片段模板文本30。
调用body:定义AT_BEGIN脚本变量30的标记体
调用body:body标签,该标签定义AT_BEGIN脚本变量片段模板文本30
就我个人而言,我认为第一种情况更有意义,但这段代码只是作为内部工作的一个示例,而不是最佳实践。
我仍然希望该示例在任何情况下都能编译/运行。我相当惊讶它没有。