19

我正在尝试访问在包含中的 JSTL for 循环上设置的一些 JSTL 变量。

例子:

<c:forEach items="${cart.entries}" var="entry">
 <jsp:include page="helper.jsp"></jsp:include>
</c:forEach>

在 helper.jsp 中,我希望能够引用变量“entry”。它一直显示为“空”。我想也许有一种方法可以像使用普通设置变量一样为 forEach 变量添加范围。

有任何想法吗?

4

2 回答 2

29

回答:我最终只需要这样做才能让它工作。

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

然后我在我的包含中引用了 entryFC。一点也不优雅,但它的工作原理,所以我想我会同意它。

于 2011-11-03T23:17:51.167 回答
2

我知道现在回答这个问题已经很晚了,但是对于那些陷入这种情况并寻找答案的人来说可能会有所帮助。

如果您没有严格限制使用<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 中。这是通过实质上将请求的页面作为单独的呈现请求提交到同一个容器并获取结果而不是文件的内容来完成的。这个请求是在它自己的上下文中完成的,这意味着它不使用与包含标签的页面相同的页面信息。这可能很方便,特别是如果包含的内容可能有冲突的变量,例如。

于 2017-06-15T11:04:20.150 回答