Componente h:dataTable

9 respostas
W

Boa noite à todos !

Não estou conseguindo imprimir uma lista de clientes em uma tela usando o JSF. Ao clicar no botão deveria apresentar uma lista de nomes em um dataTable, mas
isso não está acontecendo, alguém pode me ajudar?, lembrando que não apresenta nenhum erro, somente não apresenta a lista na tela.

Classe Cliente

public class Cliente {
    private Integer codigo;
    private String nome;
    private String cidade;
    
    public Cliente(Integer codigo, String nome, String cidade){
        super();
        this.codigo = codigo;
        this.nome = nome;
        this.cidade = cidade;
    }

    /**
     * @return the codigo
     */
    public Integer getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the cidade
     */
    public String getCidade() {
        return cidade;
    }

    /**
     * @param cidade the cidade to set
     */
    public void setCidade(String cidade) {
        this.cidade = cidade;
    }   
    
}

Meu Manager Bean

@ManagedBean
@SessionScoped
public class ConsultaClienteBean {
    private List<Cliente> clientes = new ArrayList<Cliente> ();

    /** Creates a new instance of ConsultaClienteBean */
    public ConsultaClienteBean() {
    }

    /**
     * @return the clientes
     */
    public List<Cliente> getClientes() {
        return clientes;
    }  
     
    public void consultar(ActionEvent event){
        this.getClientes().clear();
        this.getClientes().add(new Cliente(1,"João da Silva","Uberlândia"));
        this.getClientes().add(new Cliente(2,"Manoel Souza","Uberaba"));
        this.getClientes().add(new Cliente(4,"Cristina Melo","São Paulo"));
        this.getClientes().add(new Cliente(5,"Sebastião Cardoso","São Paulo"));
        this.getClientes().add(new Cliente(6,"Fransciso Borges","Uberaba"));
        this.getClientes().add(new Cliente(7,"Juliano Messias","Rio de Janeiro")); 
        this.getClientes().add(new Cliente(8,"Maria Helena","Uberlandia"));      
        
    }   
    
}


JSP


<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <body>
        <f:view>            
            <h:form id="frm">
                <h:commandButton value="Consultar" actionListener="#{consultaClienteBean.consultar}"/>
                <h:dataTable value="#{consultaClienteBean.clientes}" var="item" border="1" rendered="#{not empty consultaClienteBean.clientes}">
                    <h:column>
                        <h:outputText value="#{item.codigo}"/>
                    </h:column>
                    <h:column>
                        <h:outputText value="#{item.nome}"/>
                    </h:column>
                    <h:column>
                        <h:outputText value="#{item.cidade}"/>
                    </h:column>
                </h:dataTable>
            </h:form>
        </f:view>
    </body>
</html>

9 Respostas

AnjoVingador

Quando vc click no botão a tela sofre um refresh?
Se não sofre, vc deve repintar o datatable ou da um refresh na tela após a ação do botão.
Ou então já mandar a lista preenchida antes da ação do botão.

Falow.

alberthy

Brother, você pode carregar sua <h:datatable /> na inicilização do sistema.

Você pode criar um:

List<Objeto> allObjects;

e o valor da sua datatable seria

value="controller.allObjects"

no seu método de acesso seria:

List<Object> newList = new ArrayList<Object>();

// Sua consulta...

return newList;

Agora se você quizer fazer a consulta somente quando o click efetuado, crie um método para seu botão consultar e sete o valor no método consulta para o allObjects:

public String consulta(){

  // Sua consulta... e outros tratamentos...

  this.setAllObjects(newListQuery);
}

Irá carregar sua datatable de acordo com sua consulta.

Abraço.

W

AnjoVingador:
Quando vc click no botão a tela sofre um refresh?
Se não sofre, vc deve repintar o datatable ou da um refresh na tela após a ação do botão.
Ou então já mandar a lista preenchida antes da ação do botão.

Falow.

Mas ao clicar no botão no consultar, o próprio método está preenchendo adicionando objetos na lista.
e no código:

{not empty consultaClienteBean.clientes} - Traz a lista caso ela não esteja vazia.

<h:dataTable var="item" value="#{consultaClienteBean.clientes}" border="1" rendered="#{not empty consultaClienteBean.clientes}">
                    <h:column>
                        <h:outputText value="#{item.codigo}"/>
                    </h:column>
                    <h:column>
                        <h:outputText value="#{item.nome}"/>
                    </h:column>
                    <h:column>
                        <h:outputText value="#{item.cidade}"/>
                    </h:column>
                </h:dataTable>
public void consultar(ActionEvent event){
        this.getClientes().clear();
        this.getClientes().add(new Cliente(1,"João da Silva","Uberlândia"));
        this.getClientes().add(new Cliente(2,"Manoel Souza","Uberaba"));
        this.getClientes().add(new Cliente(4,"Cristina Melo","São Paulo"));
        this.getClientes().add(new Cliente(5,"Sebastião Cardoso","São Paulo"));
        this.getClientes().add(new Cliente(6,"Fransciso Borges","Uberaba"));
        this.getClientes().add(new Cliente(7,"Juliano Messias","Rio de Janeiro")); 
        this.getClientes().add(new Cliente(8,"Maria Helena","Uberlandia"));      
        
    }
Polverini

Edit:
Coloca seu commandButton assim :

<h:commandButton value="Consultar" action="#{consultaClienteBean.consultar}">  
            <f:ajax event="complete" render="frm"/>
        </h:commandButton>
W

Polverini:
Edit:
Coloca seu commandButton assim :

<h:commandButton value="Consultar" action="#{consultaClienteBean.consultar}"> <f:ajax event="complete" render="frm"/> </h:commandButton>

No momento não gostaria de usar a tecnologia AJAX para esse fim.

Polverini

pq não usar o ajax??

não vai mostrar nada no data table pq ele não está sendo atualizado! Ou seja nem está sendo desenhado !

o que vc pode fazer para não usar ajax é colocar o @postconstruct, assim apos criar o beans ele já faz a consulta de maneira que o dataTable não fique vazio !

W

Polverini:
pq não usar o ajax??

não vai mostrar nada no data table pq ele não está sendo atualizado! Ou seja nem está sendo desenhado !

o que vc pode fazer para não usar ajax é colocar o @postconstruct, assim apos criar o beans ele já faz a consulta de maneira que o dataTable não fique vazio !

Polverini, tudo bem?

Sobre Ajax ainda não entendo muito.

Realmente só será renderizado após clicar no botão consultar e se a lista não estiver vazia não é isso? Mas ao cliar em consultar não está
exectuando o dataTable, pois o método tem a função de popular minha lista.

Polverini

então o ajax que faz a parte de rendenizar (atualizar) a dataTable ou qlq outro componente, o que ocorre quando vc colocou o atributo

rendered="#{not empty consultaClienteBean.clientes}"

ele não desenha a dataTable (por conta do criterio estabelecido) e mesmo que vc tire ele carrega os dados mas não atualiza a dataTable.

W

Polverini:
então o ajax que faz a parte de rendenizar (atualizar) a dataTable ou qlq outro componente, o que ocorre quando vc colocou o atributo

rendered="#{not empty consultaClienteBean.clientes}"

ele não desenha a dataTable (por conta do criterio estabelecido) e mesmo que vc tire ele carrega os dados mas não atualiza a dataTable.

Realmente a dataTable não estava carregando, resolvi colocar um JOptionPane para comprovar se o método estava executando e realmente não estava, pois achei o erro:
não tem nada a ver com o código em si. Coisa bem simples e vacilo meu mesmo:

import javax.faces.event.ActionEvent;

eu estava importando o:

import javax.awt.event.ActionEvent;

Pois assim o método não estava executando.

Obrigado à todos pela ajuda !

Polverini um abraço e obrigado !

Criado 27 de junho de 2011
Ultima resposta 28 de jun. de 2011
Respostas 9
Participantes 4