0

我正在尝试为布局目的创建我的 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 和其他参考,但找不到我做错了什么。

任何帮助表示赞赏。

4

1 回答 1

2

您可以尝试将正文包含在以下内容之间<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>

检查Java EE 5 教程 - 标签类型

jsp:body 元素

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

于 2016-06-15T10:20:14.127 回答