Linguagem de Expressão JSP e Nomes de Atributos Dinâmicos
Eu estou tentando fazer algo que parece que deve ser relativamente simples e correndo em um pouco de uma parede.
Digamos que eu tenha uma lista de produtos que exponho como um atributo de solicitação sob o nomeproducts
. Vamos dizer também que cada produto tem umid
campo, e que eu também tenho um monte de atributos de pedidos definidos sob a forma deselectedProduct_<product-id>
para indicar quais estão selecionados.
Eu entendo que existem maneiras melhores de representar essas informações, como colocar todos os IDs selecionados em umMap
e checando isso, mas vamos supor que não tenho acesso a essa abordagem por qualquer motivo.
Então o que eu gostaria de fazer é iterarproducts
e emitir alguma marcação somente se houverselectedProduct_...
atributo definido para o produto atual. 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>
Mas é claro que isso não funciona, pois morre${! empty selectedProduct_${product.id}}
.
O que vai funcionar é se eu codificar o id do produto para a expressão, como:
${! empty selectedProduct_17}
... assumindo que '17' é um id de produto válido. Obviamente, isso não é prático, mas espero que ilustre o que estou tentando realizar. Basicamente eu preciso:
Determine o corretoselectedProduct_...
valor a ser usado para cada iteração noforEach
loop. Algo tão simples quanto<c:set var="key" value="selectedProduct_${product.id}"/>
faria isso, exceto que não tenho certeza de como, então,key
e usá-lo para obter o valor do atributo request com esse nome (sem trapacear e executar código Java literal dentro de um<% %>
quadra).Obtenha o valor do atributo request cujo nome determinei em # 1. Esta parece ser a parte complicada.Isso é possível usando JSP / JSTL puro? Eu sei que eu poderia executar algum código Java dentro de<% %>
para resolver isso, mas parece que seria de uma forma extremamente ruim. Certamente uma solução mais elegante existe?