2012-09-13 27 views
7

Göreceli olarak basit ve bir duvarın içine girecek gibi görünen bir şey yapmaya çalışıyorum.JSP İfadeler ve Dinamik Öznitelik Adları

Diyelim ki, products adı altında bir istek özelliği olarak gösterdiğim ürünlerin bir listesini aldım. Ayrıca, her ürünün bir id alanına sahip olduğunu ve hangisinin seçileceğini belirtmek için selectedProduct_<product-id> şeklinde ayarlanmış bir dizi istek özelliğim olduğunu da varsayalım.

Böyle bir Map içine seçilen tüm kimlikleri yerleştirerek ve buna karşı kontrol etme gibi bu bilgileri temsil etmek iyi yollar vardır anlıyorum ama ı herhangi bir nedenle bu yaklaşıma erişimi olmayan varsayalım.

yüzden yapmak istiyorum neyi products yinelerler ve geçerli ürün için ayarlanmış bir selectedProduct_... özelliği yoksa yalnızca bazı biçimlendirme yayarlar. şöyle birşey:

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

Ama ${! empty selectedProduct_${product.id}} ölür gibi çalışmıyor tabii

. '17' geçerli bir ürün kimliği olduğunu varsayarak ...

${! empty selectedProduct_17}

: Ben ifadeye ürün-id hardcode eğer çalışacaktır ne

gibi olduğunu. Açıkçası bu pratik değil, ama umarım neyi başarmaya çalıştığımı gösterir. Temelde ben gerekir:

  1. forEach döngü içinde her yineleme için kullanılacak doğru selectedProduct_... değerini belirler. <c:set var="key" value="selectedProduct_${product.id}"/> kadar basit bir şey bunu yapar, ancak key'u nasıl alacağımı bilmiyorum ve bu adla istek özniteliğinin değerini almak için onu kullan ((<% %> bloğunun içinde hile yapmadan Java kodunu çalıştırmadan).
  2. İsmini 1 olarak belirlediğim istek özelliğinin değerini öğrenin. Bu zor kısmı gibi görünüyor.

Bu, salt JSP/JSTL kullanılarak yapılabilir mi? Bunu çözmek için <% %>'un içinde bazı Java kodlarını çalıştırabileceğimi biliyorum, ama sanki son derece kötü bir şekilde olurdu. Elbette daha zarif bir çözüm var mı?

cevap

17

yapabilirsiniz implicit objects kullanarak:

Kapsam nesneleri kullanma açıklanan çeşitli kapsamına sahip değişkenler erişime izin objeler var.

  • PageScope: kendi değerlerine Haritalar sayfa kapsamına sahip değişken adları
  • requestScope: kendi değerlerine Haritalar isteği kapsamına sahip değişken adları
  • sessionScope: kendi değerlerine Haritalar oturum kapsamlı değişken adları
  • applicationScope: uygulama-Haritalar değişken adlarını değerlerine göre belirleme
Bir ifade, bu nesnelerden birinin adlarına başvurduğunda, karşılık gelen öznitelik yerine uygun nesne döndürülür. Örneğin, başka bir değer içeren varolan bir pageContext özniteliği olsa bile, $ {pageContext} PageContext nesnesini döndürür.

Yani, örneğin:

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