[RESOLVIDO]JSTL e Map

4 respostas
J

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

4 Respostas

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:

&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;
J
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:

&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;

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...

J

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;

rodrigocolasso

Blz

Criado 3 de agosto de 2011
Ultima resposta 3 de ago. de 2011
Respostas 4
Participantes 2