[RESOLVIDO] Como excluir contato do banco e atualizar dataTable (JSF2.2 + PRIMEFACES + JDBC)

Olá a todos. Estou iniciando agora meus estudos com JSF2.2 e PRIMEFACES e após tentar, tentar e tentar e não sair do lugar, resolvi pedir socorro. Tentarei descreve da melhor forma possivel o meu problema, vamos lá:

Através de um formulário eu populo uma tabela no banco e redireciono para uma segunda page que apresenta uma lista em um dataTable, ná ultima coluna destá lista tem um botão “Excluir” que deveria pegar o id destá linha e excluir esse contato do banco. Logo após, seria necessário atualizar o mesmo dataTable.

Segue código presente nas classes:

Pessoa - MODEL

public class Pessoa {
    
    private int id;
    private String nome;
    private String endereco;
    private String numero;
    private String cidade;
    private String telefone;
    private String email;
    
    public Pessoa(){
        
    }
    
   gets e sets...
}

PessoaMB - CONTROLLER

@ManagedBean
@ViewScoped
public class PessoaMB implements Serializable{

    public Pessoa pessoa;
    public List<Pessoa> listPessoa;
    public PessoaDAO pessoaDAO;
    FacesMessage alerta;
    
    public PessoaMB() throws ClassNotFoundException{
        pessoa = new Pessoa();
        listPessoa = new ArrayList<Pessoa>();
        pessoaDAO = new PessoaDAO();
    }
    
    public Pessoa getPessoa(){
        return pessoa;
    }
    
    public void setPessoa(Pessoa pessoa){
        this.pessoa = pessoa;
    }
    
     public List<Pessoa> getListPessoa() throws ClassNotFoundException, SQLException{
        return pessoaDAO.getListPessoa();
    }
    
    public void setListPessoa(List<Pessoa> listPessoa){
        this.listPessoa = listPessoa;
    }
    
    public String addPessoa() throws ClassNotFoundException, SQLException{
        String resultado = "/sucesso";
        boolean validar = pessoaDAO.inserir(pessoa);
               
        if(!validar){
           resultado = "/erro";
        }           
        return resultado;  
    }

    public String removePessoa() throws SQLException{    
        String resultado = "";
        boolean validar = pessoaDAO.remover(pessoa);
        
        if(!validar){
            resultado = "/erro";
            alerta = new FacesMessage("Entrou no método removerPessoa mas não removeu do banco!!!");
            FacesContext.getCurrentInstance().addMessage(null, alerta); 
        }       
        
        return resultado;       
    }    
    
}

Pessoa - DAO

public class PessoaDAO {

private final Conexao conn;
private PreparedStatement ps;
public List<Pessoa> listaPessoa;    
public PessoaDAO() throws ClassNotFoundException{  
    conn = new Conexao();           
} 

public boolean inserir(Pessoa pessoa) throws ClassNotFoundException, SQLException{

    String sql = "INSERT INTO pessoa VALUES(?,?,?,?,?,?,?)";
    
    try {
        ps = conn.getConnection().prepareStatement(sql);
        ps.setInt(1, 0);
        ps.setString(2, pessoa.getNome());
        ps.setString(3, pessoa.getEndereco());
        ps.setString(4, pessoa.getNumero());
        ps.setString(5, pessoa.getCidade());
        ps.setString(6, pessoa.getTelefone());
        ps.setString(7, pessoa.getEmail());     
        ps.execute();
    } catch (Exception e) {
        e.printStackTrace();
    }   
        ps.close();
        conn.fecharConexao();   
    return true;
    }

public boolean remover(Pessoa pessoa) throws SQLException{
    
    String sql = "DELETE FROM pessoa WHERE id = ?";
    
    try {
        ps = conn.getConnection().prepareStatement(sql);
        ps.setInt(1, pessoa.getId());
        ps.execute();
    } catch (Exception e) {
        e.printStackTrace();
    }
    ps.close();
    conn.fecharConexao(); 
    return true;
}

public List<Pessoa> getListPessoa() throws ClassNotFoundException, SQLException{
	  
    String sql = "SELECT * FROM pessoa ORDER BY id";
    ResultSet rs = null;
    listaPessoa = new ArrayList<Pessoa>();
    try {
        ps = conn.getConnection().prepareStatement(sql);
        rs = ps.executeQuery();
            while(rs.next()){
                Pessoa pessoa = new Pessoa();
                pessoa.setId(rs.getInt("id"));
                pessoa.setNome(rs.getString("nome"));
                pessoa.setEndereco(rs.getString("endereco"));
                pessoa.setNumero(rs.getString("numero"));
                pessoa.setCidade(rs.getString("cidade"));
                pessoa.setTelefone(rs.getString("telefone"));
                pessoa.setEmail(rs.getString("email"));
                listaPessoa.add(pessoa);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    
    return listaPessoa;
    }   
}

index - VIEW

<h:body>
        <h:form id="form">
            <h:panelGrid columns="3" id="grid">

                <p:outputLabel value="Nome"/>
                <p:inputText id="nome" size="20" value="#{pessoaMB.pessoa.nome}" required="true" requiredMessage="Campo Obrigatório"/>
                <p:message for="nome"/>

                <p:outputLabel value="Endereco" />
                <p:inputText id="end" size="20" value="#{pessoaMB.pessoa.endereco}" required="true" requiredMessage="Campo Obrigatório"/>
                <p:message for="end"/>

                <p:outputLabel value="Numero" />
                <p:inputText id="nro" size="20" value="#{pessoaMB.pessoa.numero}" required="true" requiredMessage="Campo Obrigatório"/>
                <p:message for="nro"/>
                
                <p:outputLabel value="Cidade" />
                <p:inputText id="mun" size="20" value="#{pessoaMB.pessoa.cidade}" required="true" requiredMessage="Campo Obrigatório"/>
                <p:message for="mun"/>
                
                <p:outputLabel value="Telefone" />
                <p:inputText id="tel" size="20" value="#{pessoaMB.pessoa.telefone}"/>
                <p:message for="tel"/>
                
                <p:outputLabel value="Email" />
                <p:inputText id="eml" size="20" value="#{pessoaMB.pessoa.email}"/>
                <p:message for="eml"/>
                
                <p:commandButton id="btnENVIAR" value="Enviar" type="submit" action="#{pessoaMB.addPessoa}"/>
                <p:commandButton id="btnLIMPAR" value="Limpar" type="reset"/>

            </h:panelGrid>
    
    </h:form>
    </h:body>

sucesso - VIEW

<h:form>   
    <h:panelGrid>
        <p:dataTable id="tablePessoa" value="#{pessoaMB.listPessoa}" var="lista" rows="10" emptyMessage="Sem Registro" paginator="true">
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="ID"/> 
                    </f:facet>
                    <h:outputText value="#{lista.id}"/>
                </p:column> 
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="NOME"/> 
                    </f:facet>
                    <h:outputText value="#{lista.nome}"/>
                </p:column> 
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="ENDERECO"/> 
                    </f:facet>
                    <h:outputText value="#{lista.endereco}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="NUMERO"/> 
                    </f:facet>
                    <h:outputText value="#{lista.numero}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="CIDADE"/> 
                    </f:facet>
                    <h:outputText value="#{lista.cidade}"/>
                </p:column>     
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="TELEFONE"/> 
                    </f:facet>
                    <h:outputText value="#{lista.telefone}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="EMAIL"/> 
                    </f:facet>
                    <h:outputText value="#{lista.email}"/>
                </p:column>  
                
                <p:column>
                <f:facet  name="header">
                <h:outputText value="ACAO"/>
                </f:facet>
                    <p:commandButton id="btnEXCLUIR" value="Excluir" type="submit" action="#{pessoaMB.removePessoa(lista.id)}" update="tablePessoa"/>       
                </p:column>                    
                </p:dataTable>
            </h:panelGrid> 
            
            <h:panelGrid columns="2" id="grid">
                <p:column>
                <f:facet  name="header">
                <h:outputText value="ACAO"/>
                </f:facet>
                <p:commandButton id="btnNOVO" value="Adicionar Novo" type="submit" action="/index.xhtml"/>       
                </p:column>  
            </h:panelGrid>    
    </h:form> 

Ps: Qual critica construtiva é bem vinda pois tenho quase certeza que o erro não é por mal conhecimento do framework e sim de lógica e orientação a objetos.

O dando uma olhada rapida vi alguns problemas logo de cara

seu metodo removePessoa no managedbean nao recebe parametros mas na tela no botao excluir vc chama um removePessoa (cod) que recebe parametros. Arrume isso

Outro problema é que ao remover a pessoa no metodo removePessoa vc não está removendo-a da lista que popula a tabela em tela

Os processos do JSF e Primefaces nesse caso são.

1 - Invocar o metodo de excluir
2 - Excluir do banco a pessoa.
3 - Excluir da lista que popula a tabela.
4 - Recarregar a pagina ou tabela (nesse momento a tela usa os dados presentes no managed bean).

Não se deixe enganar pensando que conhece os fluxos do frameworks :slight_smile: sucesso, amigos

Obrigado pelas dicas alexafe.

Tentarei seguir essa ordem.

Obs: Acredito que aquele parametro não seja o ideal. Pesquisando recentimente vi em um site um modo em que se usa um bean só para manipular o array que estará presente no dataTable. Conforme as dificuldade forem surgindo, volto a postar.

Obrigado. :slight_smile:

Bom dia galera.

Venho aqui novamente pois tentei de varias formas e não estou conseguindo excluir, quem puder ajudar serei muito grato.

Vamos aos problemas:

Criei um metodo getListaPessoa na classe PessoaMB que recebe a lista da DAO. Uso esse metodo para popular o dataTable.

public DataModel<Pessoa> getListarPessoa() throws ClassNotFoundException, SQLException {
        pessoaDAO = new PessoaDAO();
        List<Pessoa> listaPessoaBD = pessoaDAO.listar();
        listarPessoas = new ListDataModel<Pessoa>(listaPessoaBD);
        return listarPessoas;
    }

Ao clicar no botão excluir presente no dataTable, chamo um metodo que trás o objeto da linha getRowData().

public void selecionar() throws ClassNotFoundException, SQLException{ 
        FacesContext context = FacesContext.getCurrentInstance();    
        context.addMessage(null, new FacesMessage("OBJETO DA LINHA: " 
                + listarPessoas.getRowData()));
    }

Tentei fazer (Pessoa)listarPessoas.getRowData() e listarPessoas.getRowData().toString(); e nenhum desses metodos me retorna o que há realmente no objeto.

Alguem pode me dizer como fazer isso ou quem sabe alguma forma mais simples?

Desde de já agradeço a quem possa colaborar.

:slight_smile:

Bom…
Acho que alguns passos resolvem teu problema.

Na sua classe existe um objeto chamado pessoa.
Existem algumas forma se setar esta informação no seu Bean, a mais simples é com o comando <f:setPropertyActionListener />

Dentro do seu botao, tente fazer da seguinte maneira:

     <p:commandButton id="btnEXCLUIR" value="Excluir" type="submit" action="#{pessoaMB.removePessoa()}" update="tablePessoa">
           <f:setPropertyActionListener target="#{pessoaMB.pessoaSelecionada}" value="#{lista}"/>  
     </p:commandButton>

Vamos para algumas considerações:

  1. A propriedade var significa o nome de uma variavel para percorrer a lista, o mais recomendado é utilizar um nome que condiza ao objeto e não à lista.
  2. O commandButton atua da seguinte maneira, se os valores passarem pelas validações e conversões do JSF então será chamado o método ActionListener, serão setados os valores do Modelo (Managed Bean) e em seguida será chamado o seu método action.
  3. Não precisa-se usar, não neste caso, utilizar um data model.

Qualquer dúvida estamos ai

setPropertyActionListener do JSF

Muito obrigado mesmo ruanperondi e alexafe, não sei o que seria de mim sem a ajuda de vocês. Finalmente está funcionando, vocês são 10. \o/

Agora irei para o nivel dois. Pretendo fazer os metodos para o update e apartir dai carregar o form de cadastro com os atributos do objeto em questão.

Postarei aqui o codigo completo e funcionando para que alguém que enfrente o mesmo problema possa usar como base.

Ps: Moderadores posso colocar a tag do post como encerrado/resolvido?

Pessoa - MODEL

public class Pessoa {
    
    private int id;
    private String nome;
    private String endereco;
    private String numero;
    private String cidade;
    private String telefone;
    private String email;

gets e sets...
}    

PessoaMB - CONTROLLER

@ManagedBean
@ViewScoped
public class PessoaMB implements Serializable{

    public Pessoa pessoa;
    public PessoaDAO pessoaDAO;
    public List<Pessoa> listarPessoas;
    public Pessoa pessoaSelecionada;
    
    public PessoaMB() throws ClassNotFoundException{
        pessoa = new Pessoa(); 
        pessoaDAO = new PessoaDAO();
        pessoaSelecionada = new Pessoa();
    }
    
    public Pessoa getPessoa(){
        return pessoa;
    }
    
    public void setPessoa(Pessoa pessoa){
        this.pessoa = pessoa;
    }
    
    public Pessoa getPessoaSelecionada(){
        return pessoaSelecionada;
    }
     
    public void setPessoaSelecionada(Pessoa pessoaSelecionada){
        this.pessoaSelecionada = pessoaSelecionada;
    }
    
    public List<Pessoa> getListarPessoa() throws ClassNotFoundException{
        pessoaDAO = new PessoaDAO();
        listarPessoas = pessoaDAO.listar();
        return listarPessoas;
    }
    
    public void setListarPessoas(List<Pessoa> listarPessoas) {
        this.listarPessoas = listarPessoas;
    }
       
    public String addPessoa() throws ClassNotFoundException, SQLException{
        String resultado = "/lista";
        boolean validar = pessoaDAO.inserir(pessoa);
        if(!validar){
           resultado = "/erro";
        }           
        return resultado;  
    }
       
    public String removePessoa() throws SQLException, ClassNotFoundException{    
        String resultado = "/lista";
        pessoaDAO = new PessoaDAO();
        boolean validar = pessoaDAO.remover(pessoaSelecionada);
        pessoaSelecionada = new Pessoa();
        if(!validar){
            resultado = "/erro";       
        }           
        return resultado;       
    }
} 

PessoaDAO - DAO

public class PessoaDAO {

private final Conexao conn;
private PreparedStatement ps;
public List<Pessoa> listarPessoaBanco;    
public PessoaDAO() throws ClassNotFoundException{  
    conn = new Conexao();           
} 

public boolean inserir(Pessoa pessoa) throws ClassNotFoundException, SQLException{

    String sql = "INSERT INTO pessoa VALUES(?,?,?,?,?,?,?)";
    
    try {
        ps = conn.getConnection().prepareStatement(sql);
        ps.setInt(1, 0);
        ps.setString(2, pessoa.getNome());
        ps.setString(3, pessoa.getEndereco());
        ps.setString(4, pessoa.getNumero());
        ps.setString(5, pessoa.getCidade());
        ps.setString(6, pessoa.getTelefone());
        ps.setString(7, pessoa.getEmail());     
        ps.execute();
    } catch (Exception e) {
        e.printStackTrace();
    }   
        ps.close();
        conn.fecharConexao();   
    return true;
    }

public boolean remover(Pessoa pessoaSelecionada) throws SQLException{
    
    String sql = "DELETE FROM pessoa WHERE id = ?";
    
    try {
        ps = conn.getConnection().prepareStatement(sql);
        ps.setInt(1, pessoaSelecionada.getId());
        ps.execute();
    } catch (Exception e) {
        e.printStackTrace();
    }
    ps.close();
    conn.fecharConexao(); 
    return true;
}

public List<Pessoa> listar() {
    String sql = "SELECT * FROM pessoa ORDER BY id";
    ResultSet rs = null;
    listarPessoaBanco = new ArrayList<Pessoa>();
        try {
            ps = conn.getConnection().prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                Pessoa pessoa = new Pessoa();
                pessoa.setId(rs.getInt("id"));
                pessoa.setNome(rs.getString("nome"));
                pessoa.setEndereco(rs.getString("endereco"));
                pessoa.setNumero(rs.getString("numero"));
                pessoa.setCidade(rs.getString("cidade"));
                pessoa.setTelefone(rs.getString("telefone"));
                pessoa.setEmail(rs.getString("email"));
                listarPessoaBanco.add(pessoa);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            conn.fecharConexao();
        }
 
        return listarPessoaBanco;
    }

}

Conexao - DAO

public class Conexao {
    
    private static final String USER = "root"; 
    private static final String PASS = "senha";
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/pessoa";  
    private Connection conn;
    
    public Conexao() throws ClassNotFoundException{
        try {
            Class.forName(DRIVER);
            conn = DriverManager.getConnection(URL, USER, PASS);
        } catch (SQLException excecao) {
            throw new RuntimeException(excecao);
        }
    }
 
    public Connection getConnection() throws ClassNotFoundException {
        return conn;     
    }
    
    public void fecharConexao() {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

index - VIEW

<h:body>
        <h:form id="form">
            <h:panelGrid columns="3" id="grid">

                <p:outputLabel value="Nome"/>
                <p:inputText id="nome" size="20" value="#{pessoaMB.pessoa.nome}" required="true" requiredMessage="Campo Obrigatório"/>
                <p:message for="nome"/>

                <p:outputLabel value="Endereco" />
                <p:inputText id="end" size="20" value="#{pessoaMB.pessoa.endereco}" required="true" requiredMessage="Campo Obrigatório"/>
                <p:message for="end"/>

                <p:outputLabel value="Numero" />
                <p:inputText id="nro" size="20" value="#{pessoaMB.pessoa.numero}" required="true" requiredMessage="Campo Obrigatório"/>                
                <p:message for="nro"/>
                
                <p:outputLabel value="Cidade" />
                <p:inputText id="mun" size="20" value="#{pessoaMB.pessoa.cidade}" required="true" requiredMessage="Campo Obrigatório"/>
                <p:message for="mun"/>
                
                <p:outputLabel value="Telefone" />
                <p:inputText id="tel" size="20" value="#{pessoaMB.pessoa.telefone}"/> 
                <p:message for="tel"/>
                
                <p:outputLabel value="Email" />
                <p:inputText id="eml" size="20" value="#{pessoaMB.pessoa.email}"/>
                 <p:message for="eml"/>
                
                <p:commandButton id="btnENVIAR" value="Enviar" type="submit" action="#{pessoaMB.addPessoa}"/>
                <p:commandButton id="btnLIMPAR" value="Limpar" type="reset"/>

            </h:panelGrid>
    
    </h:form>
    </h:body>

lista - VIEW

<h:body>
    <h:form> 
    
    <h:panelGrid>
        <p:dataTable id="tablePessoa" value="#{pessoaMB.listarPessoa}" var="lista" rows="10" emptyMessage="Sem Registro" paginator="true">
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="ID"/> 
                    </f:facet>
                    <h:outputText value="#{lista.id}"/>
                </p:column> 
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="NOME"/> 
                    </f:facet>
                    <h:outputText value="#{lista.nome}"/>
                </p:column> 
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="ENDERECO"/> 
                    </f:facet>
                    <h:outputText value="#{lista.endereco}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="NUMERO"/> 
                    </f:facet>
                    <h:outputText value="#{lista.numero}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="CIDADE"/> 
                    </f:facet>
                    <h:outputText value="#{lista.cidade}"/>
                </p:column>     
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="TELEFONE"/> 
                    </f:facet>
                    <h:outputText value="#{lista.telefone}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="EMAIL"/> 
                    </f:facet>
                    <h:outputText value="#{lista.email}"/>
                </p:column>  
                
                <p:column>
                <f:facet  name="header">
                <h:outputText value="ACAO"/>
                </f:facet>
                    <p:commandButton id="btnEXCLUIR" value="Excluir" type="submit" action="#{pessoaMB.removePessoa}" process="@form" update="tablePessoa">
                    <f:setPropertyActionListener target="#{pessoaMB.pessoaSelecionada}" value="#{lista}"/>
                    </p:commandButton>
                </p:column>                    
                </p:dataTable>
            </h:panelGrid> 
            
            <h:panelGrid columns="2" id="grid">
                <p:column>
                <f:facet  name="header">
                <h:outputText value="ACAO"/>
                </f:facet>
                <p:commandButton id="btnNOVO" value="Adicionar Novo" type="submit" action="/index.xhtml"/>       
                </p:column>  
            </h:panelGrid>
            
    </h:form> 
   </h:body>      

web.xml

    <welcome-file-list>
        <welcome-file>faces/lista.xhtml</welcome-file>
    </welcome-file-list>

Sempre que vc resolver já coloca direto [RESOLVIDO]

Sim sim. :slight_smile:

Fiquei com duvida se poderia usar esse topico para novas duvidas que forem surgindo em relação ao update e carregamento dos campos da index com os atributos do objeto, ou deveria abrir um novo tópico por se tratar de um novo assunto.

O que você acha?

Sou noob com programação e ainda mais em utilização de forum. hehehehe

Sempre procure por topicos existentes referentes ao seu assunto antes de criar um novo. A solução que vc quer já pode estar em algum topico criado por outro alguem

Claro. :slight_smile:

Mais uma vez obrigado.

Tópico encerrado.