Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Renderização da minha tabela jsf2

Galera estou com o seguindo "problema" tenho meu xhtml e tenho uma tabela que é essa aqui

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://xmlns.jcp.org/jsf/html"
        xmlns:f="http://xmlns.jcp.org/jsf/core"
        xmlns:p="http://primefaces.org/ui">

    <h:head />
    <h:body>
        <h:form>
            <h:panelGrid columns="2">
                <p:outputLabel value="Nome: " for="nome"/>
                <p:inputText id="nome" value="#{clienteController.cliente.nome}"/>
                <p:outputLabel value="CPF: " for="cpf"/>
                <p:inputText id="cpf" value="#{clienteController.cliente.cpf}"/>
                <p:outputLabel value="RG: " for="rg"/>
                <p:inputText id="rg" value="#{clienteController.cliente.rg}"/>
                <p:outputLabel value="Telefone: " for="telefone"/>
                <p:inputMask id="telefone" value="#{clienteController.cliente.telefone}" mask="(999) 999-9999"/>
                <p:outputLabel value="Cidade: " for="cidade"/>
                <p:inputText id="cidade" value="#{clienteController.endereco.cidade}" />
                <p:outputLabel value="Bairro: " for="bairro"/>
                <p:inputText id="bairro" value="#{clienteController.endereco.bairro}" />
                <p:outputLabel value="Numero Casa " for="numero"/>
                <p:inputText id="numero" value="#{clienteController.endereco.numeroCasa}" />
            </h:panelGrid>
            <p:commandButton value="Salvar" action="#{clienteController.adicionaCliente}" update="@all"/>
        </h:form>

Aqui minha tabela

<h:form>    
    <p:dataTable var="cliente"  value="#{clienteController.clientes}" style="margin-bottom:40px">
        <f:facet name="header">
            Clientes Cadastrados
        </f:facet>
        <p:column headerText="Id" sortBy="#{cliente.id}">
            <h:outputText value="#{cliente.id}" />
        </p:column>

        <p:column headerText="Nome" sortBy="#{cliente.nome}">
            <h:outputText value="#{cliente.nome}" />
        </p:column>

        <p:column headerText="CPF" >
            <h:outputText value="#{cliente.cpf}" />
        </p:column>

        <p:column headerText="RG" >
            <h:outputText value="#{cliente.rg}" />
        </p:column>
          <p:column headerText="Cidade" >
            <h:outputText value="#{cliente.endereco.cidade}" />
        </p:column>
          <p:column headerText="Excluir" >
            <p:commandLink value="excluir" action="#{clienteController.remover(cliente)}" process="@this" update="@all"/>
        </p:column>
          <p:column headerText="Alterar" >
            <p:commandLink value="alterar" action="#{clienteController.carregar(cliente)}" process="@this" update="@all"/>
        </p:column>
    </p:dataTable>
        </h:form>

Sempre que eu abro meu xhtml com a tabela não aparece nenhum registro na lista, mais o engraçado é que eu tenho ja uma lista, Só que eu adiciono um novo cliente na minha lista ela aparace a lista inteira, e quando eu regarrego a página ele some novamente, e depois quando adiciono aparece ela novamente, o porque isso? e quando eu clico no meu excluir ele exclui so que tenho que regarregar a pagina para aparecer ele excluido :(

10 respostas

Olá, pelo comportamento que você descreve creio que o problemas esteja na sua classe Bean, coloque o código dela aqui para a gente poder te ajudar.

Ola Marcio

public class ClienteController implements Serializable{


    private static final long serialVersionUID = 1L;

    private Cliente cliente = new Cliente();
    private Endereco endereco = new Endereco();
    private List<Cliente> clientes;

    public void adicionaCliente() {

         if(cliente.getId() == null) {
             cliente.setEndereco(this.endereco);
             DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
             dao.adicionaCliente(this.cliente, this.endereco);
             this.clientes = dao.lstTodos();
         } else {
             new DAO<Cliente>(Cliente.class).carrega(this.cliente, this.endereco);
         }

        this.cliente = new Cliente();
        this.endereco = new Endereco();
    }

    public void carregar(Cliente cliente) {
        this.cliente = cliente;
    }
    public void remover(Cliente cliente) {
        new DAO<Cliente>(Cliente.class).remover(cliente);
    }

    public List<Cliente> getClientes() {
        DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
        if(this.cliente == null) {
            this.cliente = (Cliente) dao.lstTodos();
        }
        return clientes;
    }

    public Cliente getCliente() {
        return cliente;
    }
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
    public Endereco getEndereco() {
        return endereco;
    }
    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
}

Assim esta meu controller

O erro esta nesse metodo aqui.

public List<Cliente> getClientes() {
        DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
        if(this.cliente == null) {
            this.cliente = (Cliente) dao.lstTodos();
        }
        return clientes;
    }

Quando eu tiro a parte da verificação do if eu roda certo porem dai la na tabela eu tenho o meu sort que e para ordenar, ai para de ordenar minha tabela mas pelo menos a tabela fica normal.

solução!

Nesse momento do código

    public List<Cliente> getClientes() {
        DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
        if(this.cliente == null) {
            this.cliente = (Cliente) dao.lstTodos();
        }
        return clientes;
    }

acho que em vez de fazer a verificação em cliente deveria ser em clientes, assim como a atribuição dentro do if.

Correto era isso mesmo :( erro de desatenção. Já que estamos aqui e porque quando eu clico no meu link em excluir ele exclui só que tenho que regarregar a pagina? no update estou usando o all que seria para atualizar a pagina inteira, poderia usar o form também mais nenhum dos 2 da resutaldo, estranho né? ja que eu estou atualizando a pagina toda :(

No seu código do remover, você apenas remove do banco, mas não atualiza o atributo no bean. Para que funcione é necessário atualizar a variável clientes.

Marcio mais no meu update"@form" já não estou atualizando todo meu formulario? E com isso ja não atualiza a variavel clientes?

O problema é que seu metódo getClientes só é chamado quando os clientes == null, quando você remove um cliente essa lista não fica nula e por isso a lista de cliente não é atualizada.

O form com update all até faz o metodo getClientes ser chamado mas por causa do if não funciona. Por isso você tem que atualizar a lista dentro do remove.

Teria como eu atualizar um meu metodo dentro do meu xhtml? como ficaria? E otima explicação parabens

Já consegui mano, obrigado mais uma vez pela otima explicação