1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como fazer alteração de Registros com JSF.

Boa tarde galera. Gostaria de mais uma vez solicitar a ajuda de vocês, tenho um formulário Web (JSF, PRIMEFACES), onde o mesmo cadastra, altera, lista e exclui clientes. É um formulário simples (somente para estudo) contendo somente um campo --> nome, porém estou tentando fazer o processo de EDIÇÃO desses registros com JSF e PRIMEFACES, procurando na internet não consegui achar nenhum conteúdo explicativo de como fazer esse processo de edição. Alguém poderia me ajudar, me mostrando como fazer, ou me indicando algum tópico na internet que tenha o passo a passo explicando como fazer.

OBS: Estou tentando fazer um CRUD para estudo, onde cadastro e listagem esta funcionando perfeitamente, porém para fazer a Edição não estou conseguindo.

Espero ter conseguido explicar minha duvida, desde já muito obrigado a todos.

Pessoal vou colocar meu código aqui para vocês tentarem me ajudar, porque tentei implementar olhando os exemplos que colocaram e não consegui. Me desculpem, é que sou novato, apenas estudando a linguagem, peço até que não reparem na estrutura do código.

Segue abaixo formulário de cadastro. https://www.filepicker.io/api/file/Eohnqw2SO9EsEnGMOR2A

Abaixo o XHTML referente ao formulário acima.

<?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">
<ui:composition template="/WEB-INF/template/Layout.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:o="http://omnifaces.org/ui">
    <ui:define name="titulo">Consulta de Lancamentos</ui:define>
    <f:metadata>
        <f:viewAction action="#{consultaLancamentosBean.consulta}" />
        <f:viewAction action="#{consultaPessoaBean.consultar}" />
    </f:metadata>
    <ui:define name="corpo">
        <h:form id="form">
            <p:messages id="messages" autoUpdate="true" />
            <p:menubar style="margin-top: -20px; margin-bottom: 20px">
                <p:submenu label="Cadastros">
                    <p:menuitem value="Pessoa" />
                    <p:menuitem value="Lancamento" />
                </p:submenu>
                <p:submenu label="Consultas">
                    <p:menuitem value="Pessas" />
                    <p:menuitem value="Lancamentos" />
                </p:submenu>
                <p:submenu label="Sistema">
                    <p:menuitem value="Sair" />
                </p:submenu>
            </p:menubar>
            <p:panelGrid id="panelClienteID" columns="2" border="1"    cellspacing="0" cellpadding="2">
                <f:facet name="header">Cadastro de Cliente</f:facet>
                <p:column>
                    <p:outputLabel value="Nome: " for="campo-nome" />
                    <p:inputText value="#{consultaPessoaBean.pessoa.nome}" id="campo-nome" label="Nome" />
                    <p:commandButton value="Salvar" icon="ui-icon-disk" action="#{consultaPessoaBean.cadastrar}" update="panelClienteID panelLancamentoID" />
                </p:column>
            </p:panelGrid>

            <p:panelGrid id="panelLancamentoID" columns="2" border="1" cellspacing="0" cellpadding="2">
                <f:facet name="header">Cadatro de Lancamentos</f:facet>
                <p:outputLabel value="Descrição: " for="campo-descricao" />
                <p:inputText value="#{consultaLancamentosBean.lancamento.descricao}" id="campo-descricao" />

                <h:outputLabel value="Cliente: " for="campo-cliente" />
                <p:selectOneMenu value="#{consultaLancamentosBean.lancamento.pessoa}" id="campo-cliente" filter="true">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItems value="#{consultaPessoaBean.pessoas}" var="clientePessoa" itemValue="#{clientePessoa}" itemLabel="#{clientePessoa.nome}" />
                </p:selectOneMenu>

                <p:outputLabel value="Data de vencimento: " />
                <p:calendar value="#{consultaLancamentosBean.lancamento.dataVencimento}" locale="pt_BR" navigator="true" effect="slideDown" pattern="dd/MM/yyyy" />

                <p:outputLabel value="Data de pagamento: " />
                <p:calendar value="#{consultaLancamentosBean.lancamento.dataPagamento}" locale="pt_BR" navigator="true" effect="slideDown" pattern="dd/MM/yyyy" />

                <p:outputLabel value="Valor: " for="campo-valor" />
                <p:inputText value="#{consultaLancamentosBean.lancamento.valor}" id="campo-valor" />

                <p:outputLabel for="campo-tipo" value="Tipo: " />
                <p:selectOneMenu id="campo-tipo" value="#{consultaLancamentosBean.lancamento.tipo}">
                    <f:selectItem itemLabel="Selecione" />
                    <f:selectItem itemLabel="RECEITA" itemValue="RECEITA" />
                    <f:selectItem itemLabel="DESPESA" itemValue="DESPESA" />
                </p:selectOneMenu>

                <p:commandButton value="Salvar" icon="ui-icon-disk" actionListener="#{consultaLancamentosBean.cadastrarLancamento}" update="panelLancamentoID tableID" />

            </p:panelGrid>

            <p:dataTable id="tableID" value="#{consultaLancamentosBean.lancamentos}" var="lancamento" border="1" cellspacing="0" cellpadding="2" paginator="true" paginatorPosition="bottom" rows="5">
                <f:facet name="header">Lançamentos</f:facet>
                <p:column headerText="Pessoa">
                    <h:outputText value="#{lancamento.pessoa.nome}" />
                </p:column>
                <p:column headerText="Edição Cliente">
                    <p:commandButton value="Atualizar">
                        <f:setPropertyActionListener target="" value="" />
                    </p:commandButton>
                </p:column>
                <p:column headerText="Data Pagamento">
                    <h:outputText value="#{lancamento.dataPagamento}" />
                </p:column>
                <p:column headerText="Data Vencimento">
                    <h:outputText value="#{lancamento.dataVencimento}" />
                </p:column>
                <p:column headerText="Descrição">
                    <h:outputText value="#{lancamento.descricao}" />
                </p:column>
                <p:column headerText="Tipo">
                    <h:outputText value="#{lancamento.tipo}" />
                </p:column>
                <p:column headerText="Valor">
                    <h:outputText value="#{lancamento.valor}" />
                </p:column>
                <p:column headerText="Data">
                    <h:outputText value="#{lancamento.dataPagamento}" />
                </p:column>
            </p:dataTable>

        </h:form>
    </ui:define>
</ui:composition>

Abaixo meu repositório de Pessoa.

package com.algaworks.financeiro.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import com.algaworks.financeiro.model.Pessoa;

public class PessoaRepository {
    private EntityManager manager;

    public PessoaRepository(EntityManager manager) {
        this.manager = manager;
    }

    public void cadastrar(Pessoa pessoa) {
        this.manager.persist(pessoa);
    }

    public void listarPorID(Pessoa id){
        this.manager.find(Pessoa.class, id);
    }

    public List<Pessoa> listar(){
        TypedQuery<Pessoa> query = this.manager.createQuery("SELECT p FROM Pessoa p", Pessoa.class);
        return query.getResultList();
    }
}

Abaixo meu consultaPessoaBean.

package com.algaworks.financeiro.negocio;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.persistence.EntityManager;

import com.algaworks.financeiro.model.Pessoa;
import com.algaworks.financeiro.repository.PessoaRepository;
import com.algaworks.financeiro.util.JPAUtil;

@SessionScoped
@ManagedBean(name = "consultaPessoaBean")
public class ConsultaPessoaBean implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private List<Pessoa> pessoas;
    private Pessoa pessoa;

    public ConsultaPessoaBean() {
        pessoa = new Pessoa();
    }

    public void consultar(){
        EntityManager manager = JPAUtil.getEntityManager();
        PessoaRepository pessoaRepository = new PessoaRepository(manager);
        this.pessoas = pessoaRepository.listar();
        manager.close();
    }

    public void cadastrar(){
        EntityManager manager = JPAUtil.getEntityManager();
        PessoaRepository pessoaRepository = new PessoaRepository(manager);
        Pessoa pessoaForm = new Pessoa();
        pessoaForm.setNome(this.pessoa.getNome());
        manager.getTransaction().begin();
        pessoaRepository.cadastrar(pessoaForm);
        manager.getTransaction().commit();
        manager.close();
        pessoa = new Pessoa();
        this.consultar();
    }

    public List<Pessoa> getPessoas() {
        return pessoas;
    }

    public void setPessoas(List<Pessoa> pessoas) {
        this.pessoas = pessoas;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
}

Abaixo meu consultaLancamentoBean.

package com.algaworks.financeiro.negocio;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import com.algaworks.financeiro.exception.NegocioException;
import com.algaworks.financeiro.model.Lancamento;
import com.algaworks.financeiro.model.Pessoa;
import com.algaworks.financeiro.repository.LancamentoRepository;
import com.algaworks.financeiro.util.JPAUtil;

@SessionScoped
@ManagedBean(name = "consultaLancamentosBean")
public class ConsultaLancamentosBean implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private List<Lancamento> lancamentos;
    private Pessoa pessoa;
    private Lancamento lancamento;
    private LancamentoRepository lancamentoRepository;

    public ConsultaLancamentosBean() {
        super();
        pessoa = new Pessoa();
        lancamento = new Lancamento();
    }

    public void consulta(){
        EntityManager manager = JPAUtil.getEntityManager();
        lancamentoRepository = new LancamentoRepository(manager);
        this.lancamentos = lancamentoRepository.listar();
        manager.close();
    }

    public void cadastrarLancamento() throws NegocioException{
        Lancamento lancamentoForm = new Lancamento();
        lancamentoForm.setDescricao(this.lancamento.getDescricao());
        lancamentoForm.setPessoa(this.lancamento.getPessoa());
        lancamentoForm.setDataVencimento(this.lancamento.getDataVencimento());
        lancamentoForm.setDataPagamento(this.lancamento.getDataPagamento());
        lancamentoForm.setValor(this.lancamento.getValor());
        lancamentoForm.setTipo(this.lancamento.getTipo());
        this.preSave(lancamentoForm);
        lancamento = new Lancamento();
    }

    public void preSave(Lancamento lancamento){
        EntityManager manager = JPAUtil.getEntityManager();
        lancamentoRepository = new LancamentoRepository(manager);
        EntityTransaction transiction = manager.getTransaction();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        try {
            transiction.begin();
            this.verificaDataPagamento(lancamento);
            lancamentoRepository.cadastrar(lancamento);
            transiction.commit();
        } catch (NegocioException e) {
            transiction.rollback();
            FacesMessage message = new FacesMessage(e.getMessage());
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            facesContext.addMessage("messages", message);
        } finally {
            manager.close();
        }
        this.consulta();
    }

    public void verificaDataPagamento(Lancamento lancamento) throws NegocioException{
        if(this.lancamento.getDataPagamento() != null && this.lancamento.getDataPagamento().after(this.lancamento.getDataVencimento())){
            throw new NegocioException("Data de pagamento não pode ser maior que a data de vencimento.");
        }
    }

    public Lancamento getLancamento() {
        return lancamento;
    }

    public void setLancamento(Lancamento lancamento) {
        this.lancamento = lancamento;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public List<Lancamento> getLancamentos() {
        return lancamentos;
    }

    public void setLancamentos(List<Lancamento> lancamentos) {
        this.lancamentos = lancamentos;
    }
}

Se vocês notarem, vão ver que coloquei uma coluna no meu DataTable onde apresenta os registros de Pessoa com um botão ATUALIZAR, ou seja para que a partir do clique gostaria que o Formulário de "Cadasto de Cliente" fosse preenchido com o nome referente ao botão clicado, para que o mesmo possa ser alterado e salvo novamente.

Desde já muito obrigado.

Lucas A alteração que fiz foi a seguinte, coloquei esse código abaixo para pegar o valor selecionado no DataTable.

                <p:column headerText="Edição Cliente">
                    <p:commandButton action="#{consultaPessoaBean.atualiza}" value="Atualizar">
                        <f:setPropertyActionListener target="#{consultaPessoaBean.pessoa}" value="#{lancamento.pessoa}" />
                    </p:commandButton>

Note que após a ação do clique ele me manda para o método atualiza no meu ManagedBean, e lá o meu método me manda para a nova página para a edição do registro. Abaixo o método atualiza do ManagedBean.

    public String atualiza(){
        return "EditeCliente";
    }

E abaixo meu XHTML que o metodo envia para a atualização do registro.

<?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:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<h:title>Insert title here</h:title>
</h:head>
<h:body>
    <h:form>
        <p:panelGrid id="panelGridId" columns="2">
            <f:facet name="header">Cadastro de Cliente</f:facet>
            <p:column>
                <h:inputHidden value="#{consultaPessoaBean.pessoa.id}" />
                <p:outputLabel value="Nome: " for="campo-nome" />
                <p:inputText value="#{consultaPessoaBean.pessoa.nome}" id="campo-nome" />
                <p:commandButton value="salvar" action="#{consultaPessoaBean.cadastrar}" />                
            </p:column>
        </p:panelGrid>
    </h:form>
</h:body>
</html>

Após essa mudança eu consigo pegar o valor selecionado após o clique no botão, porém quando mando salvar ele não está alterando, ele esta salvando como um NOVO REGISTRO. Segue abaixo o meu método CADASTRAR que é chamado na página de alteração no

    public void cadastrar(){
        EntityManager manager = JPAUtil.getEntityManager();
        PessoaRepository pessoaRepository = new PessoaRepository(manager);
        Pessoa pessoaForm = new Pessoa();
        pessoaForm.setNome(this.pessoa.getNome());
        manager.getTransaction().begin();
        pessoaRepository.cadastrar(pessoaForm);
        manager.getTransaction().commit();
        manager.close();
        pessoa = new Pessoa();
        this.consultar();
    }

E se você notar, dentro desse método ele me manda para o pessoaRepository.cadastrar(pessoaForm); que é onde vai fazer aquela lógica que vc me passou. Segue abaixo.

public class PessoaRepository {
    private EntityManager manager;

    public PessoaRepository(EntityManager manager) {
        this.manager = manager;
    }

    public void cadastrar(Pessoa pessoa) {
        if(pessoa.getId() == null || pessoa.getId() == 0){
            this.manager.persist(pessoa);
        } else {
            this.manager.merge(pessoa);
        }
    }

    public void listarPorID(Pessoa id){
        this.manager.find(Pessoa.class, id);
    }

    public List<Pessoa> listar(){
        TypedQuery<Pessoa> query = this.manager.createQuery("SELECT p FROM Pessoa p", Pessoa.class);
        return query.getResultList();
    }
}

Muito Obrigado Lucas, pela ajuda que está me dando.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf ou faça a sua própria pergunta.