2012-09-13 24 views
7

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:

  1. determinar el valor correcto selectedProduct_... a utilizar para cada iteración del bucle forEach. Algo tan simple como <c:set var="key" value="selectedProduct_${product.id}"/> haría esto, excepto que no estoy seguro de cómo tomar key 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 <% %>).
  2. 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?

Respuesta

17

Puede utilizando implicit objects:

Hay objetos que permiten el acceso a las diferentes variables con ámbito descritos en Uso Alcance objetos.

  • PageScope: Mapas página de ámbito de los nombres de variables a sus valores
  • requestScope: Mapas de solicitud de ámbito de los nombres de variables a sus valores
  • sessionScope: Mapas de ámbito de sesión nombres de las variables a sus valores
  • applicationScope: Mapas Aplicación- nombres de variable con ámbito en sus valores
Cuando una expresión hace referencia a uno de estos objetos por su nombre, se devuelve el objeto apropiado en lugar del atributo correspondiente. Por ejemplo, $ {pageContext} devuelve el objeto PageContext, incluso si hay un atributo pageContext existente que contiene algún otro valor.

Así, por ejemplo:

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