7

私は、比較的単純で、少し壁にぶつかっているように見えることをしようとしています。

name の下に request 属性として公開する製品のリストがあるとしますproductsidまた、各製品にはフィールドがあり、どの製品が選択されているかを示すために、一連のリクエスト属性が の形式で設定されているとしましょうselectedProduct_<product-id>

選択したすべての ID を に配置してそれをチェックするなど、この情報を表すより良い方法があることは理解してMapいますが、何らかの理由でそのアプローチにアクセスできないと仮定しましょう。

したがって、私がやりたいことは、現在の製品に属性が設定されてproductsいる場合にのみ、マークアップを繰り返し発行することです。selectedProduct_...何かのようなもの:

<c:forEach var="product" items="${products}">
    <c:if test="${! empty selectedProduct_${product.id}}">
        <div class="productId">${product.id}</div>
    </c:if>
</c:forEach> 

しかし、もちろんそれは機能しません${! empty selectedProduct_${product.id}}

次のように、product-id を式にハードコーディングするとうまくいきます。

${! empty selectedProduct_17}

...'17' が有効な製品 ID であると仮定します。明らかにそれは実用的ではありませんが、うまくいけば、私が達成しようとしていることを示しています。基本的に私はする必要があります:

  1. ループselectedProduct_...内の各反復に使用する正しい値を決定します。forEachこれを行うのと同じくらい簡単な<c:set var="key" value="selectedProduct_${product.id}"/>ことですが、それを使用してその名前のリクエスト属性の値を取得する方法がわからないことを除いて(ブロックkey内でリテラルJavaコードをチートして実行することなく)。<% %>
  2. #1 で名前を特定した request 属性の値を取得します。これはトリッキーな部分のようです。

これは純粋な JSP/JSTL を使用して可能ですか? これを解決するためにJavaコードを内部で実行できることは知っています<% %>が、それは非常に悪い形になるようです. 確かに、よりエレガントなソリューションが存在しますか?

4

1 に答える 1

18

暗黙的なオブジェクトを使用して次のことができます。

スコープ オブジェクトの使用で説明されているさまざまなスコープ変数へのアクセスを許可するオブジェクトがあります。

  • pageScope: ページ スコープの変数名をその値にマップします
  • requestScope: リクエストスコープの変数名をその値にマップします
  • sessionScope: セッション スコープの変数名をその値にマップします
  • applicationScope: アプリケーション スコープの変数名をその値にマップします
式がこれらのオブジェクトの 1 つを名前で参照すると、対応する属性の代わりに適切なオブジェクトが返されます。たとえば、${pageContext} は、他の値を含む既存の pageContext 属性がある場合でも、PageContext オブジェクトを返します。

たとえば、次のようになります。

<c:set var="selectedProductAttrName" value="selectedProduct_${product.id}"/>
${requestScope[selectedProductAttrName]}
于 2012-09-13T08:16:12.277 に答える