JSP自定义标记 - 片段属性不起作用

时间:2016-05-01 07:22:48

标签: java jsp jsp-tags jsp-fragments

我正在尝试创建用于布局目的的jsp自定义标记。

我创建了panelLayout.tag文件,如

<%@ tag language="java" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@ attribute name="heading" required="false" %>
<%@ attribute name="footer" fragment="true"%>

<div class="panel panel-default">

    <c:if test="${not empty heading}">
        <div class="panel-heading">
            <c:out value="${heading}"></c:out>
        </div>
    </c:if>

    <div class="panel-body">    
        <jsp:doBody/>                            
    </div>

    <div class="panel-footer">
        <jsp:invoke fragment="footer"/>
    </div>  
</div>

我正在其中一个jsp中使用它,如下所示

<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:panelLayout>
    This is my body                            
   <jsp:attribute name="footer">
       This is my footer
   </jsp:attribute>
</t:panelLayout>

我的错误

org.apache.jasper.JasperException: /WEB-INF/pages/Groups.jsp (line: 86, column: 33) jsp:attribute must be the subelement of a standard or custom action
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:443)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:89)
    org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1126)
    org.apache.jasper.compiler.Parser.parseElementsScriptless(Parser.java:1499)
    org.apache.jasper.compiler.Parser.parseBody(Parser.java:1666)
    org.apache.jasper.compiler.Parser.parseOptionalBody(Parser.java:986)
    org.apache.jasper.compiler.Parser.parseCustomTag(Parser.java:1258)
    org.apache.jasper.compiler.Parser.parseElements(Parser.java:1451)
    org.apache.jasper.compiler.Parser.parse(Parser.java:138)
    org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
    org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:374)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:354)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:341)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:662)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:364)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.64 logs.

如果我删除页脚片段,它工作正常。

我从这里得到了参考 https://docs.oracle.com/cd/E19879-01/819-3669/bnamr/index.html

也搜索了stackoverflow和其他参考资料,但找不到我做错了什么。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试将正文括在<jsp:body></jsp:body>

之间
<t:panelLayout>
    <jsp:attribute name="footer">
        This is my footer
    </jsp:attribute>
    <jsp:body>
        This is my body
    </jsp:body>
</t:panelLayout>

检查The Java EE 5 Tutorial - Types of Tags

  

jsp:body元素

     

您还可以使用jsp:body元素显式指定简单标记的主体。如果使用jsp:attribute元素指定了一个或多个属性,则jsp:body是指定标记正文的唯一方法。如果一个或多个jsp:属性元素出现在标记调用的主体中,但是您没有包含jsp:body元素,则该标记具有空主体。