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?

questionAnswers(1)

yourAnswerToTheQuestion