2011-10-17 9 views
16

インクルードのJSTL for-loopに設定されたいくつかのJSTL変数にアクセスしようとしています。c:forEach変数をjsp:includeに渡す

例:helper.jspインサイド

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

私は変数 'エントリ' を参照することができるようにしたいです。それは「空の」ものとして登場し続けます。私はおそらく通常の設定変数でできるように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> 

次に、私のインクルードの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に挿入されるという点で、異なる動作をします。これは、本質的に要求されたページを別のレンダリング要求として同じコンテナに提出し、ファイルの内容ではなく結果を取得することによって行われます。この要求は独自のコンテキストで行われます。つまり、タグを含むページと同じページ情報は使用されません。これは、特に、含まれているコンテンツに矛盾する変数が含まれている場合などに便利です。