我正在尝试访问在include中的JSTL for循环上设置的一些JSTL变量。
示例:
<c:forEach items="${cart.entries}" var="entry">
<jsp:include page="helper.jsp"></jsp:include>
</c:forEach>
在helper.jsp里面我希望能够引用变量'entry'。它一直是'空'。我想也许可能有一种方法可以将范围添加到forEach变量,就像使用普通的设置变量一样。
有什么想法吗?
答案 0 :(得分:27)
<c:forEach items="${cart.entries}" var="entry">
<c:set var="entryFC" value="${entry}" scope="request"></c:set>
<jsp:include page="helper.jsp"></jsp:include>
</c:forEach>
然后我在我的include中引用了entryFC。不是很优雅,但它的工作,所以我想生病了。
答案 1 :(得分:1)
我知道回答这个问题已经很晚了,但对于那些陷入这种情况并寻找答案的人来说可能会有所帮助。
如果您没有严格限制使用<jsp: include>
标记来包含jsp,那么我的答案将会有效。相反,您可以使用<%@include file="/WEB-INF/views/path-to-jsp.jsp" %>
在页面中导入另一个jsp,此页面可以使用您的<c:forEach>
标记循环变量。
例如。
<c:forEach items="${users}" var="user">
<%@include file="/WEB-INF/views/path-to-jsp.jsp" %> <!-- here ${user} can be use in importing jsp file. -->
</c:forEach>
它正常工作,因为<%@include file="" %>
标记会将指定文件的内容注入包含标记的JSP中,就像复制并粘贴它一样。这是在解析包含文件的内容之前完成的,而不是在解析包含的JSP时解析它。这更类似于C #include指令,其中在预处理期间,在编译文件之前将包含的文件“粘贴”到位。在包含内容之后,它将在相同的上下文中进行评估,因此如果只是简单地键入内容,则所包含的代码将具有相同的访问和约束。
然而,<jsp:include page=""/>
标记的行为不同,因为呈现指定页面的结果会在标记点注入包含JSP。这通过基本上将所请求的页面作为单独的呈现请求提交到同一容器并获取结果而不是文件的内容来完成。此请求在其自己的上下文中完成,这意味着它不使用与包含标记的页面相同的页面信息。这可能很方便,特别是如果包含的内容可能具有冲突的变量,例如。