一尘不染

增强的jsp:include实现

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>

这个想法是,通过声明将项目作为属性传递给jsp:include节点,代码使它清楚了将参数提供给所包含页面的意图。

当前执行此操作的唯一机制是“全局”定义属性,然后让包含的页面从全局空间读取它。不幸的是,这失去了使用所提供的相同“意图”。此外,与任何编程环境中的全局变量一样,它使代码更难调试。

是否有人知道执行jsp:include功能但允许传入非String值的include机制的实现?或者,如果没有,我将对保留相同意图和易于调试目标的替代想法持开放态度。

附带说明,当包含的页面引发错误时,我很乐意看到一个内置的“捕获”机制:

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

阅读 351

收藏
2020-06-10

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

(目前)唯一的问题是,我将属性添加到请求范围中,然后才包含页面,然后在之后将其删除(如果已经存在,则将其重置)。相反,我想做的是包装请求对象,并覆盖属性方法以自动包括传入的值…我仍在努力。

2020-06-10