Język wyrażeń JSP i dynamiczne nazwy atrybutów
Próbuję zrobić coś, co wydaje się być stosunkowo proste i wpaść na kawałek ściany.
Powiedzmy, że mam listę produktów, które ujawniam jako atrybut żądania pod nazwąproducts
. Powiedzmy również, że każdy produkt maid
pole, a także że mam zestaw atrybutów żądania w postaciselectedProduct_<product-id>
aby wskazać, które są wybrane.
Rozumiem, że istnieją lepsze sposoby reprezentowania tych informacji, takie jak umieszczenie wszystkich wybranych identyfikatorów wMap
i sprawdzanie tego, ale załóżmy, że nie mam dostępu do tego podejścia z jakiegokolwiek powodu.
Więc chciałbym zrobić iteracjęproducts
i emitować jakieś znaczniki tylko wtedy, gdy jestselectedProduct_...
zestaw atrybutów dla bieżącego produktu. Coś jak:
<c:forEach var="product" items="${products}">
<c:if test="${! empty selectedProduct_${product.id}}">
<div class="productId">${product.id}</div>
</c:if>
</c:forEach>
Ale oczywiście to nie działa, ponieważ umiera${! empty selectedProduct_${product.id}}
.
To, co zadziała, to kodowanie identyfikatora produktu do wyrażenia, na przykład:
${! empty selectedProduct_17}
... zakładając, że „17” jest prawidłowym identyfikatorem produktu. Oczywiście to nie jest praktyczne, ale mam nadzieję, że ilustruje to, co próbuję osiągnąć. Zasadniczo muszę:
Określ poprawneselectedProduct_...
wartość do użycia dla każdej iteracji wforEach
pętla. Coś tak prostego jak<c:set var="key" value="selectedProduct_${product.id}"/>
zrobiłby to, chyba że nie jestem pewien, jak to zrobićkey
i użyj go, aby uzyskać wartość atrybutu żądania o tej nazwie (bez oszukiwania i uruchamiania dosłownego kodu Java wewnątrz a.)<% %>
blok).Uzyskaj wartość atrybutu żądania, którego nazwę określiłem w # 1. To wydaje się być trudną częścią.Czy jest to możliwe przy użyciu czystego JSP / JSTL? Wiem, że mogę uruchomić kod Java w środku<% %>
aby rozwiązać ten problem, ale wygląda na to, że będzie w wyjątkowo złej formie. Z pewnością istnieje bardziej eleganckie rozwiązanie?