Tabela de produtos com JSTL ou JSF

5 respostas
A

Estou montando uma página com uma tabela de Produtos, cada produto deve exibir seu nome em uma <td>do HTML, sendo que terei 3 colunas por linha. Fiz o seguinte código com scriptlets, mas ficou horrível. Alguém sabe como faço com <c:forEach/>do JSTL ou mesmo <h:dataTable> do JSF ?

&lt;%  java.util.List produtosEmDestaque = &#40;java.util.List&#41; request.getAttribute&#40;"produtosEmDestaque"&#41;;
for &#40;int i=0; i&lt;produtosEmDestaque.size&#40;&#41;; i=i+3&#41; &#123;
      out.print&#40;"&lt;tr&gt;"&#41;;
      for &#40;int j=0; j&lt;3; j++&#41; &#123;
            if &#40;&#40;i+j&#41; &lt; produtosEmDestaque.size&#40;&#41;&#41; &#123;
                          lojavirtual.modelo.Produto produto = &#40;lojavirtual.modelo.Produto&#41;produtosEmDestaque.get&#40;i+j&#41;;
                          out.print&#40;"&lt;td width='33%'&gt;"+produto.getNome&#40;&#41;+"&lt;/td&gt;"&#41;;
             &#125;
      &#125;
      out.print&#40;"&lt;/tr&gt;"&#41;;                                    
&#125;
%&gt;

5 Respostas

U

É, realmente ficou feio, hehe…

Bom, dexa ver se te ajudo, cara.
Não sei quase nada de JSF, mas teu caso se resolve com JSTL…

Primeiro, lembre-se de usar a uri do JSTL 1.2:

&lt;%@ taglib uri="http&#58;//java.sun.com/jsp/jstl/core" prefix="c"  %&gt;

Pra te dar uma idéia do JSTL: fazendo uma listagem simples, de apenas uma coluna, teu código seria mais ou menos assim:

&lt;c&#58;forEach var="produto" items="$&#123;requestScope.produtosEmDestaque&#125;"  &gt;
				&lt;tr&gt;
					&lt;td&gt;&lt;c&#58;out value="$&#123;produto.nome&#125;" /&gt;&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/c&#58;forEach&gt;

Pro que vc quer espeficamente, achei na internet um código, usando os indices das “linhas” e das “colunas”:

&lt;c&#58;set var="numCols" value="4"/&gt;
&lt;table&gt;
&lt;c&#58;forEach var="row" begin="0" end="$&#123;fn&#58;length&#40;names&#41;-1&#125;" step="$&#123;numCols&#125;"&gt;
  &lt;tr&gt;
  &lt;c&#58;forEach var="col" begin="$&#123;row&#125;" end="$&#123;row+numCols-1&#125;"&gt;
    &lt;td&gt;&lt;c&#58;out value="$&#123;col&#125; = $&#123;names&#91;col&#93;&#125;"/&gt;&lt;/td&gt;
  &lt;/c&#58;forEach&gt;
  &lt;/tr&gt;
&lt;/c&#58;forEach&gt;
&lt;/table&gt;

Lá ainda tem outro exemplo usando a variavel de status, que achei um pouco mais confuso, apesar de usar menos linhas de codigo. Dá uma sacada: http://forum.java.sun.com/thread.jspa?threadID=685583&messageID=3990905

Vou ver se resolvo sem essa ideia dos indices…

Espero ter ajudado…

U

http://www-128.ibm.com/developerworks/library/j-jstl0318/
amhfilho, dava dando uma olhada nesse link, e realmente fica mais legal se usar a variável de status…

A idéia é a cada iteração verificar pelo status se o índice é ou não multiplo de 3, pra decidir se começa uma nova <TR>.
Como a cada novo índice essa conta (índice MOD 3) vai tbm ser incrementada. Só devemos fechar a linha quando o resultado for 2, pois na próxima incrementação, o índice será multiplo de 3. Logo uma nova <TR> deve ser criada…

Algo mais ou menos assim:

&lt;c&#58;set var="numCol" value="3" /&gt;
&lt;c&#58;forEach var="produto" items="$&#123;requestScope.produtosEmDestaque&#125;" varStatus="status"&gt;

   &lt;c&#58;if test="$&#123;status.index % numCol == 0&#125;"&gt;
      &lt;tr&gt;
   &lt;/c&#58;if&gt;

   &lt;td&gt;&lt;c&#58;out value="$&#123;produto.nome&#125;" /&gt;&lt;/td&gt; 

   &lt;c&#58;if test="$&#123;&#40;status.index % numCol == numCol-1&#41; or status.last&#125;"&gt;
      &lt;/tr&gt;
   &lt;/c&#58;if&gt;

&lt;/c&#58;forEach&gt;

Demorou, mas caiu minha ficha, rs
Abracos

A

Valeu uchoaaa, era isso mesmo ! Antes de ler sua resposta acabei desenvolvendo algo assim que também funciona, apesar de achar a sua solução melhor escrita:

&lt;c&#58;forEach items="$&#123;produtosEmDestaque&#125;" var="produto" varStatus="i" step="$&#123;3&#125;"&gt;
    &lt;tr&gt;
    &lt;c&#58;forEach begin="$&#123;0&#125;" end="$&#123;2&#125;" var="j"&gt;
        &lt;td&gt;$&#123;produtosEmDestaque&#91;i.index+j&#93;.id&#125;&lt;/td&gt;    
     &lt;/c&#58;forEach&gt;
     &lt;/tr&gt;                   
&lt;/c&#58;forEach&gt;

A propósito você sabe como “empacotar” todo este código em uma taglib customizada, para que possamos usar algo do tipo <c:gradeProdutos items="{$produtos"}/>?

U

O único porém dessa solução é que como teoricamente esses ifs podem ser falsos e nunca imprimir os <TR>, o Eclipse os marca como erro… :mad:

“amhfilho”:

A propósito você sabe como “empacotar” todo este código em uma taglib customizada, para que possamos usar algo do tipo <c:gradeProdutos items="{$produtos"}/>?

Pois é, cara, é justamente esse meu próximo passo, hehe.
Achei algumas referencias na net, inclusive no tutorial JEE da Sun, mas ainda não coloquei a mão na massa…
Se alguem tiver algo sobre, seria interessante…

Abraços

A

Achei uma série de tutoriais de tags customizadas, mas ainda não consegui aplicar no meu caso:
http://www.orionserver.com/docs/tutorials/taglibs/

Criado 13 de maio de 2007
Ultima resposta 18 de mai. de 2007
Respostas 5
Participantes 2