一直困扰我的一件事<jsp:include..>是,不可能将非String值作为页面的不同输入传递到包含的页面中。例如,我希望能够执行以下操作:
<jsp:include..>
<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>
阅读了这里的答案,并对这个问题进行了进一步的研究之后,我得出了以下结论:
我做了一些工作,将代码组合在一起以实现所需的内容,然后将其放在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>
(目前)唯一的问题是,我将属性添加到请求范围中,然后才包含页面,然后在之后将其删除(如果已经存在,则将其重置)。相反,我想做的是包装请求对象,并覆盖属性方法以自动包括传入的值…我仍在努力。