Solucionado (ver solução)
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