私は、比較的単純で、少し壁にぶつかっているように見えることをしようとしています。
name の下に request 属性として公開する製品のリストがあるとしますproducts
。id
また、各製品にはフィールドがあり、どの製品が選択されているかを示すために、一連のリクエスト属性が の形式で設定されているとしましょう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 であると仮定します。明らかにそれは実用的ではありませんが、うまくいけば、私が達成しようとしていることを示しています。基本的に私はする必要があります:
- ループ
selectedProduct_...
内の各反復に使用する正しい値を決定します。forEach
これを行うのと同じくらい簡単な<c:set var="key" value="selectedProduct_${product.id}"/>
ことですが、それを使用してその名前のリクエスト属性の値を取得する方法がわからないことを除いて(ブロックkey
内でリテラルJavaコードをチートして実行することなく)。<% %>
- #1 で名前を特定した request 属性の値を取得します。これはトリッキーな部分のようです。
これは純粋な JSP/JSTL を使用して可能ですか? これを解決するためにJavaコードを内部で実行できることは知っています<% %>
が、それは非常に悪い形になるようです. 確かに、よりエレガントなソリューションが存在しますか?