Duvidas em como montar tabela dinamicamente no JBoss Sean / JSF

5 respostas
R

Olá pessoal, preciso de um help.
Creio que é algo muito basico, porem eu estou começando com Seam e JSF, e infelizmente estou sem tempo de estudar com calma, pois tenho trabalho a entregar.
Bom, eis o meu drama :
Eu quero iterar uma List que contem alguns objetos do tipo Produto, estes produtos estão ordenados por um atributo do tipo Categoria, meu objetivo é listar os produtos mais vendidos por categoria, como exemplo, o html abaixo :

<table border="5" >
   <tr>
      <td>
         <table border="1" >
            <thead>
               <tr>
                  <th>categoria 1</th>
               </tr>
            </thead>
            <tr>
               <td>produto 1</td>
            </tr>
            <tr>
               <td>produto 2</td>
            </tr>
            <tr>
               <td>produto 3</td>
            </tr>					
         </table>
      </td>
      <td>
         <table border="1" >
            <thead>
               <tr>
                  <th>categoria 2</th>
               </tr>
            </thead>
            <tr>
               <td>produto 1</td>
            </tr>
            <tr>
               <td>produto 2</td>
            </tr>
            <tr>
               <td>produto 3</td>
            </tr>					
         </table>
      </td>
   </tr>
</table>

O problema para mim é saber quando muda a categoria do produto, para criar a segunda, terceira e a N tabela com a categoria no titulo e os produtos logo abaixo. Com JSTL seria facil resover isso com <c:forEach> e <c:if>, porem procurando por uma solução no google, li muitos comentários que não se deve misturar JSTL com JSF, eu vi que o pode ser substituido pelo e o por , mas não entendi como fazer isso que com JSTL seria muito simples, como disse acima, estou começando com esta tecnologia e estou sem tempo de debruçar e estudar. Então vim pedir a ajuda de vocês, pois não gostaria de usar POG.

Agradeço qualquer ajuda.

Ronaldo.

5 Respostas

Alexandre_Saudate

Então… as coisas em JSF não funcionam com JSTL (até funcionam, mas não são recomendadas e não é o modelo que deve ser seguido).

Para fazer uma iteração sobre a tabela , você o usa a tag h:dataTable . Para criar as colunas, h:column. O resto (a iteração sobre os dados , a primeira linha do cabeçalho, etc.) ele faz.

No seu caso, fica uma coisa mais ou menos assim:

<h:dataTable ... > <h:column> <f:facet name="header"><h:outputText value="categoria 1" /></f:facet> <h:outputText value="produto 1" /> </h:column> <h:dataTable>

E assim em diante… desculpe pelo exemplo minimalista, mas uma busca no Google por h:dataTable deve te ajudar bem a entender como isso funciona.

[]´s

R

Obrigado por responder.
Imagine a situação, tenho uma List com 6 Produtos, sendo que os 3 primeiros são da Categoria 1 e os outros 3 da Categoria 2, eu vi o componente DataTable, agora me diz uma coisa, usando ele, como é que eu “digo a ele” que a hora de criar uma nova coluna, no meu caso, é quando muda a categoria associada ao produto ? Tem como fazer isso no DataTable, sem programação extra ??? De qualquer maneira, estou pesquisando o uso desta tag no google.

Grato,

Ronaldo

Alexandre_Saudate

Bom… na verdade, existe uma gambiarra pra isso, mas, por ser gambiarra, prefiro nem comentar. =P

Acho q o ideal pra fazer isso seria você fazer um componente que estenda dataTable, de maneira que você use a tabela desse jeito.

R

Criar um componente é sempre uma saida interessante, porém, como estou com a corda no pescoço, não terei tempo de estudar em como fazer um componente, pois ainda não sei como as coisas funcionam no JSF. Então não existe outra maneira de iterar uma lista no JSF sem usar dataTable ?

R

Resolvi o problema usando rich:dataGrid, eis o código …

<rich:panel>
        <f:facet name="header">
            <h:outputText value="Produtos mais populares em cada categoria"></h:outputText>
        </f:facet>
        <h:form>
        <rich:dataGrid value="#{categoriesList.produtosMaisVendidos}" var="mvc" columns="3" elements="9" width="600px">
            <rich:panel bodyClass="pbody">
                <f:facet name="header">
                    <h:outputText value="#{mvc.catName}"></h:outputText>
                </f:facet>
                <h:panelGrid columns="1">
                	<rich:dataList var="prod" value="#{prodList.getProdsByCategory(mvc.catId)}" rows="5">
                		<h:outputText value="#{prod.prodName}"/><br/>
                	</rich:dataList>
                </h:panelGrid>
            </rich:panel>
        </rich:dataGrid>
        </h:form>
    </rich:panel>

Gostei bastante do resultado, muito legal esse componente.

Criado 7 de janeiro de 2010
Ultima resposta 12 de jan. de 2010
Respostas 5
Participantes 2