Lenguaje de expresión JSP y nombres de atributos dinámicos
Estoy tratando de hacer algo que parece que debería ser relativamente sencillo y chocar contra una pared.
Digamos que tengo una lista de productos que expongo como un atributo de solicitud con el nombreproducts
. Digamos también que cada producto tiene unaid
campo, y que también tengo un conjunto de atributos de solicitud establecidos en forma deselectedProduct_<product-id>
para indicar cuáles están seleccionados.
Entiendo que hay mejores formas de representar esta información, como colocar todos los identificadores seleccionados en unMap
y verificando eso, pero asumamos que no tengo acceso a ese enfoque por cualquier razón.
Así que lo que me gustaría hacer es iterarproducts
y emitir algún marcado sólo si hay unaselectedProduct_...
atributo establecido para el producto actual. Algo como:
<c:forEach var="product" items="${products}">
<c:if test="${! empty selectedProduct_${product.id}}">
<div class="productId">${product.id}</div>
</c:if>
</c:forEach>
Pero, por supuesto, eso no funciona, ya que muere en${! empty selectedProduct_${product.id}}
.
Lo que funcionará es si codifico el producto-id en la expresión, como:
${! empty selectedProduct_17}
... asumiendo que '17' es una identificación de producto válida. Obviamente eso no es práctico, pero espero que ilustre lo que estoy tratando de lograr. Básicamente necesito:
Determinar la correctaselectedProduct_...
valor a utilizar para cada iteración en elforEach
lazo. Algo tan simple como<c:set var="key" value="selectedProduct_${product.id}"/>
haría esto, excepto que no estoy seguro de cómo tomarkey
y úselo para obtener el valor del atributo de solicitud con ese nombre (sin hacer trampa ni ejecutar el código de Java literal dentro de un<% %>
bloquear).Obtenga el valor del atributo de solicitud cuyo nombre determiné en # 1. Esta parece ser la parte difícil.¿Es esto posible usando JSP / JSTL puro? Sé que podría ejecutar algún código Java dentro de<% %>
para resolver esto, pero parece que estaría en una forma extremadamente mala. ¿Seguro que existe una solución más elegante?