代码之家  ›  专栏  ›  技术社区  ›  evnafets

JSP.13.8示例简单标记处理程序场景不起作用?

  •  0
  • evnafets  · 技术社区  · 17 年前

    这项测试是由阅读提示的 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

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

    1 回复  |  直到 17 年前
        1
  •  2
  •   Kees de Kooter chotai.mit    17 年前

    从 syntax reference

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

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

    推荐文章