[RESOLVIDO]JSTL e Map

Galera, tô precisando de uma ajuda aqui

Tenho uma lista de chaves do Map (na variável ciclos). E nessa lista eu pego a chave, e com a chave pego o valor correspondente no Map. Até ai beleza, fiz os foreach necessários, mas na hora de passar a chave, dá erro. Ele não entende o comando…coloquei abaixo o que tentei.

Se eu coloco o valor hard code, ele traz normal!

Segue código:

<c:forEach var="relatorio" items="${lista}" varStatus="loop"> <tr class="${((loop.index % 2) == 0) ? 'even' : 'odd'}"> <td align="center">${relatorio.codProduto}</td> <c:forEach var="campanha" items="${ciclos}"> <td align="center">${relatorio.valorPorCiclo[${campanha.ciclo}]}</td> </c:forEach> </tr> </c:forEach>

Tentei assim também e também não funcionou :frowning:

<c:forEach var="relatorio" items="${lista}" varStatus="loop"> <tr class="${((loop.index % 2) == 0) ? 'even' : 'odd'}"> <td align="center">${relatorio.codProduto}</td> <c:forEach var="campanha" items="${ciclos}"> <c:set var="i" value = "${campanha.ciclo}" /> <td align="center">${relatorio.valorPorCiclo[${i}]}</td> </c:forEach> </tr> </c:forEach>

O Map declarado no java está assim Map<Long,Integer> (Tive que colocar Long, porque o JSTL se perde se coloco Integer) :?

Enfim, alguém já passou por isso? Podem me ajudar?

Valeu

Bom dia Javablue,

eu colocaria a lista ciclos dentro da lista de relatorio, dai quando você faz um foreach no relatório ele já contem a lista tipo assim:

&lt;c:forEach var="relatorio" items="${lista}" varStatus="loop"&gt;   
    &lt;tr class="${((loop.index % 2) == 0) ? 'even' : 'odd'}"&gt;   
        &lt;td align="center"&gt;${relatorio.codProduto}&lt;/td&gt;   
        &lt;c:forEach var="campanha" items="${relatorio.ciclos}"&gt;             
            &lt;td align="center"&gt;${campanha.ciclo}&lt;/td&gt;   
        &lt;/c:forEach&gt;   
    &lt;/tr&gt;   
&lt;/c:forEach&gt;  


[quote=rodrigocolasso]Bom dia Javablue,

eu colocaria a lista ciclos dentro da lista de relatorio, dai quando você faz um foreach no relatório ele já contem a lista tipo assim:

[code]
<c:forEach var=“relatorio” items="${lista}" varStatus=“loop”>
<tr class="${((loop.index % 2) == 0) ? ‘even’ : ‘odd’}">
<td align=“center”>${relatorio.codProduto}</td>
<c:forEach var=“campanha” items="${relatorio.ciclos}">
<td align=“center”>${campanha.ciclo}</td>
</c:forEach>
</tr>
</c:forEach>

[/code][/quote]

Bom dia cara.

Então, mas os valores estão no relatorio.valorPorCiclo. Que é um map. E as chaves desse map, estão nessa outra lista campanha.ciclos.

Entendeu?

Estamos fazendo uns testes aqui, parece que esse Long que tá matando…

Descobri o que era. Como disse anteriormente, o map era Map<Long,Integer> Porque quando você passa um valor hard code no JSTL, ele faz um autoboxing meio furado e não aceita a chave. A explicação está aqui.

Agora no meu caso, a lista que eu mando com as chaves é Integer…e quando vai como chave do Map, ele não entende e não traz o valor correto. Trocamos as chaves para Long e funcionou.

Segue código resolvido:

&lt;c:forEach var="relatorio" items="${lista}" varStatus="loop"&gt; &lt;tr class="${((loop.index % 2) == 0) ? 'even' : 'odd'}"&gt; &lt;td align="center"&gt;${relatorio.codProduto}&lt;/td&gt; &lt;c:forEach var="campanha" items="${ciclos}"&gt; &lt;td align="center"&gt;${relatorio.valorPorCiclo[campanha.ciclo}&lt;/td&gt; &lt;/c:forEach&gt; &lt;/tr&gt; &lt;/c:forEach&gt;

Blz