Enchanced jsp:包含实现

RHS*_*ger 5 java jsp

一直困扰我的事情之一<jsp:include..>是,不可能将非String值作为页面的不同输入传递到包含的页面中.例如,我希望能够执行以下操作:

<c:forEach var="item" items="${listOfItems}">
    <jsp:include page="mypage.jsp">
        <jsp:attribute name="item" value="${item}/>
    </jsp:include>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

这个想法是,通过声明项目作为jsp:include节点内的属性传入,代码正在明确意图是什么......将该参数提供给包含的页面.

目前唯一可用的机制是定义属性"global",然后让包含的页面从全局空间中读取它.不幸的是,这失去了使用<jsp:param>提供的相同"意图".此外,它使代码更难调试,原因与任何编程环境中的全局变量相同.

有没有人知道执行jsp:include函数的include机制的实现,但是允许传入非String值?或者,如果没有,我会接受其他想法,保持意图和调试的简单目标.

作为旁注,我很乐意看到内置的"catch"机制,当包含的页面抛出错误时:

<abc:include page="mypage">
    <abc:param name="something" value="some string value"/>
    <abc:attribute name="somethingelse" value="${nonStringValue}"/>
    <abc:catch var="ex">
        The page failed, so the content it generated will not be sent to the output
        stream. Instead, we can collapse the part of the page that it's content
        would be... possibly putting a comment in the page with
        <!-- There was an exception generating this module: 
             <c:out value="${ex.getMessage}/>
          -->
    </abc:catch>
</abc:include>
Run Code Online (Sandbox Code Playgroud)

RHS*_*ger 1

阅读了这里的答案,再加上对该主题进行了额外的研究,我得出了以下结论:

  • 您可以序列化对象,然后在包含的 JSP 中反序列化它们。不喜欢这个,因为它使代码更加复杂(您传入的每个对象都必须是可序列化的,等等)
  • 您可以使用标签库。不喜欢这个,因为我觉得它们的作用与 JSP 包含文件不同
  • 您可以在请求范围内定义变量,这将使它们可供包含的 JSP 使用。不太喜欢这个,因为它没有显示程序员的意图(将值传递到包含的页面,仅供使用)。
  • 确实没有(我能找到)实现我正在寻找的东西,但它可能会构建一些通过自定义标签接近的东西。

我做了一些工作并将代码组合在一起以实现我正在寻找的目标,然后将其放在 sourceforge 上。它允许您按照我描述的方式指定输入:

<inc:include page="normal.jsp">
    <inc:param name="param1" value="param1value" />
    <inc:param name="param2" value="param2value" />
    <inc:attrib name="attrib1" value="${attrib1value}" />
    <inc:attrib name="attrib2" value="${attrib2value}" />
    <inc:catch var="ex">
       This block was not rolled up because there wasn't an error. 
       Should never see this, but just in case, the exception was: ${ex.message}
    </inc:catch>
</inc:include>
Run Code Online (Sandbox Code Playgroud)

唯一的问题(此时)是我在包含页面之前将属性添加到请求范围,然后在之后删除它们(或者如果它们已经存在则重置它们)。相反,我想做的是包装请求对象并重写属性方法以自动包含传入的值...我仍在研究这一点。