JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 4)

Este é o quarto post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei o Managed Bean, que é a classe que receberá as solicitações da camada de visão (JSP), e as encaminhará para a camada de Façade. Nesta etapa o sistema já entrará em funcionamento com suas operações CRUD básicas.

Estrutura do projeto

mb

Códigos

PessoaMB.java:

package br.com.serjaum.mb;

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

import br.com.serjaum.facade.PessoaFacade;
import br.com.serjaum.facade.PessoaFacadeImpl;
import br.com.serjaum.modelo.Pessoa;

public class PessoaMB implements Serializable {

    private static final long serialVersionUID = -333995781063775201L;
    private Pessoa pessoa = new Pessoa();
    private Long id;

    public PessoaMB(){
        System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do PESSOA_MB <<<<<<<<<<<<<<<<<<");

        if(this.pessoa == null){
            this.pessoa = new Pessoa();
        }
    }

    public String save(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        pessoaService.salva(this.pessoa);
        this.pessoa = new Pessoa();
        return "cadastraSucesso";
    }

    public String delete(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        this.pessoa.setId(id);
        pessoaService.remove(this.pessoa);
        this.pessoa = new Pessoa();
        return "removeSucesso";
    }

    public String merge(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        pessoaService.atualiza(this.pessoa);
        this.pessoa = new Pessoa();
        return "atualizaSucesso";
    }

    public String load(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        this.pessoa = pessoaService.procura(this.id);
        return "pesquisaSucesso";
    }

    public String pesquisaByNome(){
        PessoaFacadeImpl pessoaService = new PessoaFacadeImpl();
        this.pessoa = pessoaService.procuraByNome(this.pessoa.getNome());
        return "pesquisaByNomeSucesso";
    }

    public List<Pessoa> getPessoas(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        return pessoaService.lista();
    }

    public List<Pessoa> getPessoasByNome(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        List<Pessoa> lista = pessoaService.pesquisaPessoasByNome(this.pessoa.getNome());
        return lista;
    }

    public Pessoa getPessoa() {
       return pessoa;
   }

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

   public Long getId() {
       return id;
   }

   public void setId(Long id) {
      this.id = id;
   }
 }

atualizaPessoa.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
<f:view>
 <h:form>
 <a4j:keepAlive beanName="pessoaMB" />
 <fieldset><legend>Atualização de Dados</legend> 

 <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1">
 <h:column>
 <f:facet name="header">
 <h:outputText value="NOME" />
 </f:facet>
 <h:outputText value="#{fisica.nome}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="E-MAIL" />
 </f:facet>
 <h:outputText value="#{fisica.email}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CPF" />
 </f:facet>
 <h:outputText value="#{fisica.cpf}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="DATA NASC." />
 </f:facet>
 <h:outputText value="#{fisica.dataNascimento}">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:outputText>
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CELULAR" />
 </f:facet>
 <h:outputText value="#{fisica.telefoneCelular}" />
 </h:column>

 <h:column>
 <a4j:commandLink reRender="panelGridInputs">
 <h:outputText value="Atualiza"/>
 <f:setPropertyActionListener  value="#{fisica}" target="#{pessoaMB.pessoa}"/>
 </a4j:commandLink>

 </h:column>

 <f:facet name="footer">
 <rich:datascroller />
 </f:facet>

 </rich:dataTable>

 <h:panelGrid columns="2" id="panelGridInputs">
 <h:outputLabel for="nome" value="Nome "  />
 <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/>

 <h:outputLabel for="email" value="E-mail "  />
 <h:inputText id="email" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/>

 <h:outputLabel for="cpf" value="CPF "  />
 <h:inputText id="cpf" validatorMessage="CPF inválido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/>

 <h:outputLabel for="dataNasc" value="Data Nascimento: "  />
 <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:inputText> 

 <h:outputLabel for="telCel" value="Tel. Celular "  />
 <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}" />

 <h:commandButton value="Salvar modificações" action="#{pessoaMB.merge}"/>

 </h:panelGrid>
 </fieldset>

 </h:form>
</f:view>
</body>
</html>

cadastraPessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
<f:view>
 <h:form>
 <h:messages/>

 <fieldset>
 <legend>Cadastro de Pessoa</legend>
 <h:panelGrid columns="2">
 <h:outputLabel for="nome" value="Nome "  />
 <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" styleClass="edit" size="40" />

 <h:outputLabel for="email" value="E-mail "  />
 <h:inputText id="email" value="#{pessoaMB.pessoa.email}" styleClass="edit" size="30" />

 <h:outputLabel for="cpf" value="CPF "  />
 <h:inputText id="cpf" value="#{pessoaMB.pessoa.cpf}" styleClass="edit" size="11" />

 <h:outputLabel for="dataNasc" value="Data Nascimento "  />
 <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" styleClass="edit" size="10" >
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:inputText>

 <h:outputLabel for="telCel" value="Tel. Celular "  />
 <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}" styleClass="edit" size="10" />

 <h:commandButton value="Inserir" action="#{pessoaMB.save}" styleClass="botoes"/>
 </h:panelGrid>
 </fieldset>
 </h:form>
</f:view>
</body>
</html>

pesquisaPessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
<f:view>

 <h:form>
 <a4j:keepAlive beanName="pessoaMB" />
 <h:messages/>

 <fieldset>
 <legend>Pesquisa de Pessoas</legend>
 <h:panelGrid columns="2">

 <h:outputLabel for="nomeLabel" value="Digite o nome: " />
 <h:inputText id="nomeInput" value="#{pessoaMB.pessoa.nome}" style=" width : 321px;" />

 <h:commandButton value="Pesquisar" action="#{pessoaMB.pesquisaByNome}"/>
 </h:panelGrid>

 <h:panelGrid columns="2" id="panelGridInputs">
 <h:outputLabel for="nome" value="Nome "  />
 <h:inputText id="nome" readonly="true" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/>

 <h:outputLabel for="email" value="E-mail "  />
 <h:inputText id="email" readonly="true" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/>

 <h:outputLabel for="cpf" value="CPF "  />
 <h:inputText id="cpf" readonly="true" validatorMessage="CPF inválido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/>

 <h:outputLabel for="dataNasc" value="Data Nascimento: "  />
 <h:inputText id="dataNasc" readonly="true" validatorMessage="Data de nascimento com formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:inputText> 

 <h:outputLabel for="telCel" value="Tel. Celular "  />
 <h:inputText id="telCel" readonly="true" value="#{pessoaMB.pessoa.telefoneCelular}" />
 </h:panelGrid>
 </fieldset>
 </h:form>
</f:view>
</body>
</html>

removePessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
<f:view>
 <h:form>
 <fieldset><legend>Remoção de Pessoas</legend> 

 <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1">
 <h:column>
 <f:facet name="header">
 <h:outputText value="NOME" />
 </f:facet>
 <h:outputText value="#{fisica.nome}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="E-MAIL" />
 </f:facet>
 <h:outputText value="#{fisica.email}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CPF" />
 </f:facet>
 <h:outputText value="#{fisica.cpf}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="DATA NASC." />
 </f:facet>
 <h:outputText value="#{fisica.dataNascimento}">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:outputText>
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CELULAR" />
 </f:facet>
 <h:outputText value="#{fisica.telefoneCelular}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="Exclusão"/>
 </f:facet>

 <h:commandLink action="#{pessoaMB.delete}">
 <h:outputText value="Excluir"/>
 <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaMB.id}" />
 </h:commandLink>

 </h:column>

 <f:facet name="footer">
 <rich:datascroller />
 </f:facet>

 </rich:dataTable>
 </fieldset>

 </h:form>
</f:view>
</body>
</html>

Importando o projeto

  1. Baixe o projeto atualizado >>aqui<<;
  2. Descompacte o projeto no seu workspace;
  3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.

Criando o banco de dados

  1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um novo schema com o nome de jsf.
  2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados;

Próximas etapas

O nosso sistema já está funcionando, mas a interface dele não está muito amigável para ser utilizada pelo usuário final.  As quatro operações CRUD estão codificadas e funcionando perfeitamente, então nas próximas etapas irei adicionar regras de navegação, validadores, conversores, máscaras, CSS, etc.

Até o próximo post!


4 Comentários on “JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 4)”

  1. Rodrigo disse:

    Parabéns…

    Não só por este post, mais pelo blog inteiro.

    Não conhecia o blog, mais já adicionei aos favoritos. Conteúdo muito interessante, parabéns mesmo pela iniciativa e força para continuar assim, pois sei que não é fácil.

  2. Eduardo disse:

    Muito bom. Continue com seu trabalho!
    Parabéns


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s