1

I'm having some trouble with this, and google wasn't really helpful on this particular subject.

I have the following that I want to execute:

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

The idea behind it is that I have a set of "blocks". This allows me to create a page in a modular fashion. This works just fine, and I'm happy with the way it works.

Now I want to customize the content of the blocks by passing a few key/value pairs to it while the page is being created:

<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>

This however gives me a nasty 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)

Perhaps my limited understanding of jstl is preventing me from fixing this issue. Am I even setting up this correctly?

Tovi7
  • 2,793
  • 3
  • 23
  • 27

1 Answers1

1

I don't know how your blockJSPs look like, but i suggest this workaround :

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

This will set the collection blockParams available in all the requestScope, therefore it will be accessible within the .jsp corresponding to the block - treat the collection inside this jsp, as a variable instead of a parameter.

Source : Passing c:forEach variable to a jsp:include

Community
  • 1
  • 1
Ephi
  • 346
  • 2
  • 12
  • I'm actually amazed this works. I was under the impression that you couldn't pass hashmaps to an external JSP file directly, and that you always had to work with primitive elements. In any case, I'm glad this works. – Tovi7 Jul 22 '16 at 13:02