【问题标题】:Passing a set of parameters to jsp include using jstl将一组参数传递给 jsp 包括使用 jstl
【发布时间】:2016-07-19 11:53:03
【问题描述】:

我遇到了一些麻烦,谷歌在这个特定主题上并没有真正的帮助。

我想要执行以下操作:

<c:forEach var="block" items="${blocks}">
    <jsp:include page="${block.blockJSP}"/
</c:forEach>

它背后的想法是我有一组“块”。这允许我以模块化方式创建页面。这很好用,我对它的工作方式很满意。

现在我想通过在创建页面时传递几个键/值对来自定义块的内容:

<c:forEach var="block" items="${blocks}">
    <jsp:include page="${block.blockJSP}">
        <c:forEach var="blockParam" items="${block.blockParameters}">
            <jsp:param name="${blockParam.key}" value="${blockParam.value}"/>
        </c:forEach>
    </jsp:include>
</c:forEach>

然而,这给了我一个讨厌的 JasperException:

org.apache.jasper.JasperException: /jsp/survey.jsp (line: 113, column: 24) Expecting "jsp:param" standard action with "name" and "value" attributes
        at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
        at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:443)
        at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:89)
        at org.apache.jasper.compiler.Parser.parseParam(Parser.java:809)
        at org.apache.jasper.compiler.Parser.parseBody(Parser.java:1655)
        at org.apache.jasper.compiler.Parser.parseOptionalBody(Parser.java:986)
        at org.apache.jasper.compiler.Parser.parseInclude(Parser.java:838)
        at org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1100)
        at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1434)
        at org.apache.jasper.compiler.Parser.parseBody(Parser.java:1647)
        at org.apache.jasper.compiler.Parser.parseOptionalBody(Parser.java:986)
        at org.apache.jasper.compiler.Parser.parseCustomTag(Parser.java:1258)
        at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1435)
        at org.apache.jasper.compiler.Parser.parse(Parser.java:138)
        at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
        at org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
        at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:374)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:354)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:341)
        at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
        at com.narran.survey.SurveyServlet.showSurvey(SurveyServlet.java:45)
        at com.narran.survey.SurveyServlet.doGet(SurveyServlet.java:27)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)

也许我对 jstl 的有限理解使我无法解决这个问题。我是否正确设置了这个?

【问题讨论】:

    标签: java jsp jstl


    【解决方案1】:

    我不知道您的 blockJSP 长什么样,但我建议采用这种解决方法:

    <c:forEach var="block" items="${blocks}">
        <c:set var="blockParams" value="${block.blockParameters}" scope="request" />
        <jsp:include page="${block.blockJSP}" />
    </c:forEach>
    

    这将设置集合blockParams 在所有requestScope 中可用,因此可以在与块对应的.jsp 中访问它 - 将此jsp 中的集合视为变量而不是参数。

    来源:Passing c:forEach variable to a jsp:include

    【讨论】:

    • 我真的很惊讶这个作品。我的印象是您不能直接将哈希图传递给外部 JSP 文件,而且您总是必须使用原始元素。无论如何,我很高兴这行得通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2011-04-03
    • 2014-06-30
    • 2011-09-12
    相关资源
    最近更新 更多