2011-10-17 78 views
16

我想要訪問在include中的JSTL for-loop上設置的一些JSTL變量。將c:forEach變量傳遞給一個jsp:include

例子:

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

裏面helper.jsp我希望能夠引用變量 '入口'。它不斷出現「空洞」。我想也許可能有一種方法可以將範圍添加到forEach變量,就像使用正常設置變量一樣。

任何想法?

回答

25

答:我最終只是爲了讓它工作。

<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。不是非常優雅,但它的工作,所以我想不適應它。

+11

我四處尋找更優雅的方式,但最終這樣做。順便說一下,你不需要重命名變量:''工作得很好,很可能不那麼令人困惑。 – Dmitri

0

我知道現在回答這個問題的時間已經很晚了,但可以幫助那些陷入這種情況並尋找答案的人。

如果您不是沒有緊緊地使用<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中。這是通過實質上將所請求的頁面提交給同一個容器來完成的,作爲單獨的呈現請求,並且取得結果,而不是文件的內容。此請求在其自己的上下文中完成,這意味着它不會使用與包含該標記的頁面相同的頁面信息。例如,這可能很方便,尤其是如果包含的內容可能有衝突的變量。