2012-09-13 14 views
7

私は、それが比較的簡単で壁の一部に走らなければならないような何かをしようとしています。JSPの式と動的な属性の名前

たとえば、リクエスト属性としてproductsの名前で公開している商品のリストがあります。また、それぞれの製品にidフィールドがあり、どれが選択されているかを示すためにselectedProduct_<product-id>の形式で要求属性の束を設定しているとします。

私は、選択したすべてのidsを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}}に死ぬとして、動作しませんもちろん。 「17」は、有効な製品IDであると仮定すると...

${! empty selectedProduct_17}

:私は式に製品IDをハードコーディング場合は動作します何

は次のように、です。明らかにそれは実用的ではありませんが、私が達成しようとしていることがうまくいけばうまくいきます。基本的に私のことを行う必要があります

  1. forEachループ内の各反復のために使用する正しいselectedProduct_...値を決定します。私はkeyをどのように受け取り、その名前のリクエスト属性の値を得るために使うのか分からないことを除いて(<% %>ブロック内でリテラルJavaコードを実行して実行しないで)、<c:set var="key" value="selectedProduct_${product.id}"/>という単純なものがこれを行うでしょう。
  2. 名前が#1で決定されたリクエスト属性の値を取得します。これは難しい部分のようです。

これは純粋なJSP/JSTLを使用して可能ですか?私はこれを解決するために<% %>の中にいくつかのJavaコードを走らせることができますが、それは非常に悪い形になるようです。確かにより洗練されたソリューションが存在しますか?

答えて

17

することができますimplicit objectsを使用することにより:

スコープオブジェクトの使用に記載されている種々のスコープの変数へのアクセスを許可するオブジェクトがあります。

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

したがって、たとえば:

<c:set var="selectedProductAttrName" value="selectedProduct_${product.id}"/> 
${requestScope[selectedProductAttrName]}