Estoy tratando de hacer algo que parece que debería ser relativamente sencillo y tropezar con una pequeña pared.Expresiones JSP y nombres de atributos dinámicos
Digamos que tengo una lista de productos que expongo como un atributo de solicitud con el nombre products
. Digamos también que cada producto tiene un campo id
, y que también tengo un conjunto de atributos de solicitud establecidos en el formulario selectedProduct_<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 un Map
y compararlos, pero supongamos que no tengo acceso a ese enfoque por el motivo que sea.
Lo que me gustaría hacer es iterar products
y emitir algunas marcas solo si hay un atributo selectedProduct_...
establecido para el producto actual. Algo así 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 que no funciona, ya que muere en ${! empty selectedProduct_${product.id}}
.
Lo que funciona es si el producto hardcode-id en la expresión, como:
${! empty selectedProduct_17}
... suponiendo que '17' es un identificador de producto válida. Obviamente, eso no es práctico, pero espero que ilustre lo que intento lograr. Necesito básicamente:
- determinar el valor correcto
selectedProduct_...
a utilizar para cada iteración del bucleforEach
. 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 usarlo para obtener el valor del atributo de solicitud con ese nombre (sin copiar y ejecutar el código literal de Java dentro de un bloque<% %>
). - Obtiene el valor del atributo de solicitud cuyo nombre determiné en el n. ° 1. Esta parece ser la parte difícil.
¿Es esto posible utilizar 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. Seguramente existe una solución más elegante?