42
JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 1) Posted by serjaumfantin em julho 31, 2009 Esta é a primeira parte da nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática. Pretendo criar uma aplicação simples e ao mesmo tempo prática ilustrando situações do dia-a-dia. Utilizarei o Eclipse e o servlet contêiner Tomcat . A aplicação é baseada em um cadastro de pessoas onde o usuário terá acesso a operações de Create/Retrieve/Update/Delete. Utilizarei máscaras, conversores, validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros. Versões utilizadas Eclipse 3.4.1 JDK 1.6 Tomcat 6.0.18 MyFaces 1.2.5 RichFaces 3.3.1 Hibernate Annotations 3.4.0 Hibernate 3.3.1 MySQL 5 JUnit 4.5 Caelum Stella 1.2 MySQL Query Browser 1.2 Estrutura inicial do projeto

78410311 JSF Tutorial CRUD Hibernate Mysql

Embed Size (px)

Citation preview

Page 1: 78410311 JSF Tutorial CRUD Hibernate Mysql

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

Posted by serjaumfantin em julho 31, 2009

Esta é a primeira parte da nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática. Pretendo criar uma aplicação simples e ao mesmo tempo prática ilustrando situações do dia-a-dia. Utilizarei o Eclipse e o servlet contêiner Tomcat.

A aplicação é baseada em um cadastro de pessoas onde o usuário terá acesso a operações de Create/Retrieve/Update/Delete. Utilizarei máscaras, conversores, validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros.

Versões utilizadas

• Eclipse 3.4.1• JDK 1.6• Tomcat 6.0.18• MyFaces 1.2.5• RichFaces 3.3.1• Hibernate Annotations 3.4.0• Hibernate 3.3.1• MySQL 5• JUnit 4.5• Caelum Stella 1.2• MySQL Query Browser 1.2

Estrutura inicial do projeto

Page 2: 78410311 JSF Tutorial CRUD Hibernate Mysql

Importando o projeto

1. Baixe o projeto >>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.

Resultado

Continuarei o próximo post desenvolvendo a camada de persistência da aplicação. Até o próximo post!

Page 3: 78410311 JSF Tutorial CRUD Hibernate Mysql

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

Posted by serjaumfantin em agosto 1, 2009

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

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei a camada DAO (Data Access Object) que é responsável por isolar a camada superior do acesso aos dados. Na maioria dos casos teremos uma classe DAO para cada classe do domínio do sistema. Na classe DAO estão os métodos fundamentais para persistência e na classe PessoaDAO temos os métodos específicos de manipulação de dados referente à classe Pessoa mais os métodos da classe DAO que são obtidos por herança.

Estrutura do projeto

Códigos

DAO.java:

package br.com.serjaum.dao;

import java.util.List;import org.apache.log4j.Logger;import org.hibernate.Session;

Page 4: 78410311 JSF Tutorial CRUD Hibernate Mysql

public class DAO { private static Logger logger = Logger.getLogger(DAO.class); private Class persistentClass; protected Session session;

public DAO(Session session, Class persistentClass) { this.session = session; this.persistentClass = persistentClass; }

@SuppressWarnings("unchecked") public T load(Long id) { logger.info("lendo " + persistentClass + " com id " + id); return (T) session.load(persistentClass, id); }

public void save(T t) { logger.info("salvando " + t); session.save(t); }

public void delete(T t) {logger.info("Deletando " + t);session.delete(t);

}

@SuppressWarnings("unchecked") public List list() {

logger.info("Listando todos"); return session.createCriteria(persistentClass).list(); }

public void merge(T t) { logger.info("Salvando ou atualizando " + t); session.merge(t); }}

PessoaDAO.java

package br.com.serjaum.dao;

import java.util.List;

import org.apache.log4j.Logger;import org.hibernate.Criteria;import org.hibernate.Session;import org.hibernate.criterion.Order;import org.hibernate.criterion.Projections;import org.hibernate.criterion.Restrictions;

import br.com.serjaum.modelo.Pessoa;

public class PessoaDAO extends DAO<Pessoa>{

private Logger logger = Logger.getLogger(PessoaDAO.class);

public PessoaDAO(Session session, Class<?> classe) {

Page 5: 78410311 JSF Tutorial CRUD Hibernate Mysql

super(session, classe);}

public Pessoa pesquisaPessoaById(Long idPessoa) {logger.info("pesquisaPessoaById : " + idPessoa);return (Pessoa) session.load(Pessoa.class, idPessoa);

}

public String pesquisaPessoaByNome(String nome) {logger.info("pesquisaPessoaByNome : " + nome);Criteria c = session.createCriteria(Pessoa.class);c.add(Restrictions.ilike("nome", nome + "%"));c.addOrder(Order.asc("nome"));

return (String)c.uniqueResult();}

public Pessoa pesquisaPessoaByEmail(String email) {logger.info("pesquisaPessoaByEmail : " + email);Criteria c = session.createCriteria(Pessoa.class);c.add(Restrictions.ilike("email", email + "%"));

return (Pessoa)c.uniqueResult();}

public List<String> findByNameSuggest(String busca){logger.info("findByNameSuggest : " + busca);Criteria c = session.createCriteria(Pessoa.class);c.add(Restrictions.ilike("nome", busca + "%"));c.addOrder(Order.asc("nome"));c.setProjection(Projections.property("nome"));

return c.list();}

}

package br.com.serjaum.dao;import java.util.List;import org.apache.log4j.Logger;

import org.hibernate.Criteria;

import org.hibernate.Session;

import org.hibernate.criterion.Order;

import org.hibernate.criterion.Restrictions;

import br.com.serjaum.entidades.Pessoa;

public class PessoaDAO {

private Session session;

private Logger logger = Logger.getLogger(PessoaDAO.class);

public PessoaDAO(Session session) {

logger.info(“Construtor” + session);

Page 6: 78410311 JSF Tutorial CRUD Hibernate Mysql

this.session = session;

}

public void insertPessoa(Pessoa pessoa) {

session.saveOrUpdate(pessoa);

}

public void updatePessoa(Pessoa pessoa) {

session.merge(pessoa);

}

public void deletePessoa(Pessoa pessoa) {

session.delete(pessoa);

}

public Pessoa retrievePessoa(Pessoa pessoa) {

return (Pessoa) session.load(Pessoa.class, pessoa.getId());

}

public Pessoa retrievePessoaById(Long idPessoa) {

return (Pessoa) session.load(Pessoa.class, idPessoa);

}

@SuppressWarnings(“unchecked”)

public List<Pessoa> loadAll(){

Criteria c = session.createCriteria(Pessoa.class);

c.addOrder(Order.asc(“nome”));

return c.list();

}

public String retrievePessoaByNome(String nome) {

Criteria c = session.createCriteria(Pessoa.class);

Page 7: 78410311 JSF Tutorial CRUD Hibernate Mysql

c.add(Restrictions.ilike(“nome”, nome + “%”));

c.addOrder(Order.asc(“nome”));

return (String)c.uniqueResult();

}

public Pessoa retrievePessoaByEmail(String email) {

Criteria c = session.createCriteria(Pessoa.class);

c.add(Restrictions.ilike(“email”, email + “%”));

return (Pessoa)c.uniqueResult();

}

}

HibernateUtil.java

package br.com.serjaum.dao;

import org.apache.log4j.Logger;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

private static final Logger logger = Logger.getLogger(HibernateUtil.class);

private static final SessionFactory sessionFactory;

private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();

static {sessionFactory = new

AnnotationConfiguration().configure().buildSessionFactory();}

public static Session openSession() {if (sessions.get() != null) {

logger.error("There was a session for this thread already!! ");

// grave, alguem nao fechou uma sessao ja aberta!

}sessions.set(sessionFactory.openSession());return sessions.get();

}

public static void closeCurrentSession() {

Page 8: 78410311 JSF Tutorial CRUD Hibernate Mysql

sessions.get().close();sessions.set(null);

}

public static Session currentSession() {return sessions.get();

}}

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory name=""> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost/jsf</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="hibernate.format_sql">false</property> <property name="hibernate.show_sql">false</property> <property name="hibernate.hbm2ddl.auto">none</property> <property name="hibernate.c3p0.acquire_increment">1</property> <property name="hibernate.c3p0.idle_test_period">100</property> <property name="hibernate.c3p0.max_size">10</property> <property name="hibernate.c3p0.max_statements">0</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.timeout">100</property>

<mapping class="br.com.serjaum.modelo.Pessoa"/>

</session-factory></hibernate-configuration>

xxx

PessoaTest.java:

package br.com.serjaum.pessoa.test;

import static org.junit.Assert.*;

import java.util.Date;

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.AnnotationConfiguration;import org.junit.After;import org.junit.Before;import org.junit.Test;

Page 9: 78410311 JSF Tutorial CRUD Hibernate Mysql

import br.com.serjaum.dao.DAO;import br.com.serjaum.modelo.Pessoa;

public class PessoaTest{private static Pessoa PESSOA_TESTE = new Pessoa();

SessionFactory sf;Session session;Transaction tx;DAO<Pessoa> dao;

@Beforepublic void runBeforeEveryTest(){

sf = new AnnotationConfiguration().configure().buildSessionFactory();

session = sf.openSession();tx = session.beginTransaction();dao = new DAO<Pessoa>(session, Pessoa.class);

}

@Afterpublic void runAfterEveryTest(){

tx.commit();session.close();

}

@Testpublic void testCadastra(){

PESSOA_TESTE.setNome("Sérgio Fantin");PESSOA_TESTE.setCpf("123.456.789-10");PESSOA_TESTE.setEmail("[email protected]");PESSOA_TESTE.setTelefoneCelular("(44) 8888-8888");

dao.save(PESSOA_TESTE);}

@Testpublic void testProcura() {

Pessoa buscada;

buscada = dao.load(PESSOA_TESTE.getId());

assertEquals(PESSOA_TESTE.getId(), buscada.getId());assertEquals(PESSOA_TESTE.getNome(),

buscada.getNome());assertEquals(PESSOA_TESTE.getEmail(),

buscada.getEmail());assertEquals(PESSOA_TESTE.getCpf(), buscada.getCpf());assertEquals(PESSOA_TESTE.getTelefoneCelular(),

buscada.getTelefoneCelular());assertEquals(PESSOA_TESTE.getDataNascimento(),

buscada.getDataNascimento());}

@Testpublic void testAtualiza(){

Pessoa buscadoParaAtualizacao; Pessoa buscadoAposAtualizacao;

buscadoParaAtualizacao = dao.load(PESSOA_TESTE.getId()); buscadoParaAtualizacao.setNome("Nome modificado");

Page 10: 78410311 JSF Tutorial CRUD Hibernate Mysql

buscadoParaAtualizacao.setEmail("[email protected]"); buscadoParaAtualizacao.setCpf("000.000.000-00"); buscadoParaAtualizacao.setTelefoneCelular("(00) 0000-

0000"); buscadoParaAtualizacao.setDataNascimento(new Date());

dao.merge(buscadoParaAtualizacao);

buscadoAposAtualizacao = dao.load(PESSOA_TESTE.getId()); assertEquals(buscadoParaAtualizacao.getId(),

buscadoAposAtualizacao.getId()); assertEquals(buscadoParaAtualizacao.getNome(),

buscadoAposAtualizacao.getNome()); assertEquals(buscadoParaAtualizacao.getEmail(),

buscadoAposAtualizacao.getEmail()); assertEquals(buscadoParaAtualizacao.getCpf(),

buscadoAposAtualizacao.getCpf()); assertEquals(buscadoParaAtualizacao.getTelefoneCelular(),

buscadoAposAtualizacao.getTelefoneCelular()); assertEquals(buscadoParaAtualizacao.getDataNascimento(),

buscadoAposAtualizacao.getDataNascimento());}

@Testpublic void testRemove(){

Pessoa pessoa = PESSOA_TESTE;pessoa.setId(1l);dao.delete(pessoa);

}}

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.

Executando o projeto

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;

3. Para testar a camada DAO execute a classe br.com.serjaum.pessoa.test.PessoaTest.java.

Obs: o test irá executar as 4 operações CRUD. O último teste com a assinatura public void testRemove() removerá os registros gravados/atualizados pelos testes anteriores. Caso não queira remover o registro testado comente o código do método testRemove() antes de executar o teste.

Page 11: 78410311 JSF Tutorial CRUD Hibernate Mysql

Resultado

Continuarei o próximo post desenvolvendo a camada de visão da aplicação. Até o próximo post!

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

Posted by serjaumfantin em agosto 18, 2009

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

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei a camada de Façade que é responsável por abstrair a camada de negócios, que contribuirá para a redução do acoplamento entre as camadas da aplicação. Essa camada tem a função de receber solicitações de operações e repassá-las para os métodos de negócio/persistência que estão em outras camadas, mantendo a arquitetura coerente e aumentando a manutenabilidade da aplicação.

Obs: por se tratar de um tutorial prático, preferi simplificar a aplicação adicionando a camada de Façade de uma maneira simples, por isso fiz o gerenciamento de sessões/transações dentro da classe PessoaFacadeImpl.java. O ideal seria retirar esse código de abertura/fechamento de sessões/transações e colocá-lo em um filtro, por exemplo: Open Session In View. Isso é aplicado quando utilizamos um Servlet Contêiner como o Tomcat ou Jetty, mas se o deploy for feito em um Servidor de Aplicação (JBoss, GlassFish, etc) o gerenciamento fica por conta do mesmo, daí é só alegria (ou não?!).

Estrutura do projeto

Page 12: 78410311 JSF Tutorial CRUD Hibernate Mysql

Códigos

BaseFacade.java:

package br.com.serjaum.facade;

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

public interface BaseFacade<T> extends Serializable { public abstract void salva(T t);

public abstract void remove(T t);

public abstract T procura(Long id);

public abstract void atualiza(T t);

public abstract List<T> lista();}

PessoaFacade.java:

package br.com.serjaum.facade;

import java.util.List;import br.com.serjaum.modelo.Pessoa;

public interface PessoaFacade extends BaseFacade<Pessoa>{ public void salva(Pessoa p);

public void remove(Pessoa p);

public Pessoa procura(Long id);

Page 13: 78410311 JSF Tutorial CRUD Hibernate Mysql

public void atualiza(Pessoa p);

public List<Pessoa> pesquisaPessoasByNome(String nome);}

PessoaFacadeImpl.java:

package br.com.serjaum.facade;

import java.util.List;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.AnnotationConfiguration;import br.com.serjaum.dao.PessoaDAO;import br.com.serjaum.modelo.Pessoa;

public class PessoaFacadeImpl implements PessoaFacade {

private static final long serialVersionUID = 1818242808424001885L; private PessoaDAO pessoaDAO; private SessionFactory sf; private Session session; private Transaction tx;

public void salva(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

this.pessoaDAO.save(p);

tx.commit(); session.close(); }

public void atualiza(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

this.pessoaDAO.merge(p);

tx.commit(); session.close(); }

public Pessoa procura(Long id) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

Pessoa p = this.pessoaDAO.load(id);

Page 14: 78410311 JSF Tutorial CRUD Hibernate Mysql

tx.commit(); session.close();

return p; }

public void remove(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

this.pessoaDAO.delete(p);

tx.commit(); session.close(); }

public List<Pessoa> lista() { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

List<Pessoa> lista = this.pessoaDAO.list();

tx.commit(); session.close();

return lista; }

public List<Pessoa> pesquisaPessoasByNome(String nome) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

List<Pessoa> lista = this.pessoaDAO.pesquisaPessoas(nome);

tx.commit(); session.close();

return lista; }

public Pessoa procuraById(Long id){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

Pessoa p = this.pessoaDAO.pesquisaPessoaById(id);

tx.commit(); session.close();

Page 15: 78410311 JSF Tutorial CRUD Hibernate Mysql

return p; }

public Pessoa procuraByNome(String nome){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

Pessoa p = this.pessoaDAO.pesquisaPessoaByNome(nome);

tx.commit(); session.close();

return p; }

public Pessoa procuraByEmail(String email){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

Pessoa p = this.pessoaDAO.pesquisaPessoaByEmail(email);

tx.commit(); session.close();

return p; }}

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;

No próximo post eu irei codificar o nosso Managed Bean e os arquivos da camada de visão. Até o próximo post!

Page 16: 78410311 JSF Tutorial CRUD Hibernate Mysql

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

Posted by serjaumfantin em agosto 19, 2009

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

Códigos

PessoaMB.java:

package br.com.serjaum.mb;

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

Page 17: 78410311 JSF Tutorial CRUD Hibernate Mysql

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(){

Page 18: 78410311 JSF Tutorial CRUD Hibernate Mysql

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>

Page 19: 78410311 JSF Tutorial CRUD Hibernate Mysql

<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}" />

Page 20: 78410311 JSF Tutorial CRUD Hibernate Mysql

<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>

Page 21: 78410311 JSF Tutorial CRUD Hibernate Mysql

</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" />

Page 22: 78410311 JSF Tutorial CRUD Hibernate Mysql

</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}">

Page 23: 78410311 JSF Tutorial CRUD Hibernate Mysql

<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

Page 24: 78410311 JSF Tutorial CRUD Hibernate Mysql

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!

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

Posted by serjaumfantin em agosto 25, 2009

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

Dando continuidade ao desenvolvimento da parte visual da nossa aplicação, adicionarei as regras de navegação, CSS, máscaras para os campos, validadores, conversores e Ajax.

Estrutura do projeto

Códigos

index.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"%>

Page 25: 78410311 JSF Tutorial CRUD Hibernate Mysql

<!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"><link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /><script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script></head>

<body><f:view> <h:form> <h:messages /> <fieldset> <legend>Cadastro de Pessoas Físicas</legend> <h:panelGrid> <h:commandLink value="Adicionar pessoa" action="toCadastraPessoa" /> <h:commandLink value="Pesquisar pessoa" action="toPesquisaPessoa" /> <h:commandLink value="Remover pessoa" action="toRemovePessoa" /> <h:commandLink value="Atualizar pessoa" action="toAtualizaPessoa" /> </h:panelGrid> </fieldset> </h:form></f:view></body></html>

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"%><%@ taglib prefix="stella" uri="http://stella.caelum.com.br/faces"%>

<!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"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> <script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script></head>

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

Page 26: 78410311 JSF Tutorial CRUD Hibernate Mysql

<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>

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

</h:column>

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

<rich:messages/>

<a4j:region id="regiaoAjax">

Page 27: 78410311 JSF Tutorial CRUD Hibernate Mysql

<a4j:status id="sts"> <f:facet name="start"> <h:graphicImage value="/images/ajax-loader.gif" /> </f:facet> </a4j:status> </a4j:region>

<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;"> <f:validator validatorId="emailValidator"/> </h:inputText>

<h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" validatorMessage="CPF inválido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"> <rich:jQuery selector="#cpf" query="mask('999.999.999-99')" timing="onload"/> <stella:validateCPF formatted="true"/> </h:inputText>

<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" /> <rich:jQuery selector="#dataNasc" query="mask('99/99/9999')" timing="onload"/> </h:inputText>

<h:outputLabel for="telCel" value="Tel. Celular " /> <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}"> <rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')" timing="onload"/> </h:inputText>

<a4j:commandButton value="Atualizar" action="#{pessoaMB.merge}" styleClass="botoes" status="sts" reRender="fisicas"/> <a4j:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/> </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"%>

Page 28: 78410311 JSF Tutorial CRUD Hibernate Mysql

<%@ taglib prefix="stella" uri="http://stella.caelum.com.br/faces"%><%@ 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"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> <script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script></head>

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

<fieldset> <legend>Cadastro de Pessoa</legend> <a4j:region id="regiaoAjax"> <a4j:status id="sts"> <f:facet name="start"> <h:graphicImage value="/images/ajax-loader.gif" /> </f:facet> </a4j:status> </a4j:region>

<h:panelGrid columns="2" id="inputs"> <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}" required="true" requiredMessage="Campo e-mail obrigatório!" styleClass="edit" size="30"> <f:validator validatorId="emailValidator"/> </h:inputText>

<h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" value="#{pessoaMB.pessoa.cpf}" styleClass="edit" size="11"> <rich:jQuery selector="#cpf" query="mask('999.999.999-99')" timing="onload"/> <stella:validateCPF formatted="true"/> </h:inputText>

<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" /> <rich:jQuery selector="#dataNasc" query="mask('99/99/9999')" timing="onload"/> </h:inputText>

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

Page 29: 78410311 JSF Tutorial CRUD Hibernate Mysql

<rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')" timing="onload"/> </h:inputText>

<a4j:commandButton value="Inserir" action="#{pessoaMB.save}" status="sts" reRender="inputs" styleClass="botoes"/> <a4j:commandButton value="Voltar" immediate="true" action="toIndex" 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"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /></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}" styleClass="botoes"/> <h:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/> </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 " />

Page 30: 78410311 JSF Tutorial CRUD Hibernate Mysql

<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"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /></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" />

Page 31: 78410311 JSF Tutorial CRUD Hibernate Mysql

</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>

<a4j:commandLink action="#{pessoaMB.delete}" status="sts" reRender="fisicas" > <h:outputText value="Excluir"/> <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaMB.id}" /> </a4j:commandLink> </h:column>

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

<a4j:region id="regiaoAjax"> <a4j:status id="sts"> <f:facet name="start"> <h:graphicImage value="/images/ajax-loader.gif" /> </f:facet> </a4j:status> </a4j:region>

<h:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/> </fieldset> </h:form></f:view></body></html>

Page 32: 78410311 JSF Tutorial CRUD Hibernate Mysql

Navigation Rules

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.

Resultado

Page 33: 78410311 JSF Tutorial CRUD Hibernate Mysql
Page 34: 78410311 JSF Tutorial CRUD Hibernate Mysql
Page 35: 78410311 JSF Tutorial CRUD Hibernate Mysql
Page 36: 78410311 JSF Tutorial CRUD Hibernate Mysql

Espero ter ajudado!

JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (Parte Final)

Posted by serjaumfantin em agosto 27, 2009

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

Dando continuidade ao desenvolvimento da nossa aplicação, adicionarei a parte de autenticação, pois percebi nas listas e fóruns que esse é um problema comum, onde desenvolvedores se deparam frequentemente, por não se tratar de um problema trivial.

Na implementação usarei um Servlet Filter fazendo papel de um interceptador, que será executado a cada request e response. Ele verificará se o usuário pode se logar no sistema, caso contrário redirecionará o mesmo para uma página de login.

Page 37: 78410311 JSF Tutorial CRUD Hibernate Mysql

Estrutura do projeto

Códigos

AuthFilter.jsp:

package br.com.serjaum.filtro;

import java.io.IOException;

import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;

Page 38: 78410311 JSF Tutorial CRUD Hibernate Mysql

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

public class AuthFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest rq = (HttpServletRequest) request; HttpServletResponse rp = (HttpServletResponse) response; boolean auth = rq.getSession().getAttribute("user") != null;

if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) { rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf"); } else {

try { chain.doFilter(request, response); } catch (Exception e) { e.printStackTrace(); } } }

public void destroy() {

}

public void init(FilterConfig config) throws ServletException {

}}

PessoaMB.jsp (trecho relevante):

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 login() throws Exception{ boolean logado = false; HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false); HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); PessoaFacade pessoaService = new PessoaFacadeImpl();

Page 39: 78410311 JSF Tutorial CRUD Hibernate Mysql

logado = pessoaService.autentica(this.pessoa.getEmail(), this.pessoa.getSenha());

if(logado){ session.setAttribute("user", logado); rp.sendRedirect(rq.getContextPath() + "/pages/index.jsf"); return "success"; }else{ session.setAttribute("user", null); session.removeAttribute("user"); rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf"); return "failure"; } }

public String logout() { HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); FacesContext facesContext = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false); session.invalidate(); try { rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf"); } catch (IOException e) { e.printStackTrace(); }

return "logoutOk"; } ...

PessoaFacadeImpl.java (trecho relevante):

...public boolean autentica(String email, String senha){ boolean autenticado;

sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class);

autenticado = this.pessoaDAO.verificaEmailSenha(email, senha);

tx.commit(); session.close();

return autenticado; }...

PessoaDAO.java (trecho relevante):

...public boolean verificaEmailSenha(String email, String senha){ boolean valid = false;

Page 40: 78410311 JSF Tutorial CRUD Hibernate Mysql

System.out.println("DAO metodo isValidLoginAndPassword..."); System.out.println("DAO session.isOpen() >>> " + session.isOpen());

Query query = session.createQuery("from Pessoa p where p.email = :em and p.senha = :sen"); query.setString("em", email); query.setString("sen", senha);

Pessoa pessoa = (Pessoa) query.uniqueResult();

if(pessoa != null){ valid = true; }

System.out.println("DAO Pessoa >>> " + pessoa);

return valid; }...

login.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"><link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /><script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script></head>

<body><f:view> <h:form> <rich:messages /> <fieldset> <h:panelGrid columns="2"> <h:outputText value="E-mail" styleClass="rotulos" /> <h:inputText id="email" value="#{pessoaMB.pessoa.email}" styleClass="edit" size="90" style=" width : 150px;"> <f:validator validatorId="emailValidator" /> </h:inputText>

<h:outputLabel for="senha" value="Senha" styleClass="rotulos"/> <h:inputSecret id="senha" styleClass="edit" validatorMessage="A senha deve ter no mínimo 6 caracteres!" value="#{pessoaMB.pessoa.senha}" size="60" style=" width : 150px;"> <f:validateLength minimum="6"/> </h:inputSecret>

Page 41: 78410311 JSF Tutorial CRUD Hibernate Mysql

<a4j:commandButton id="botao" value="Entrar" action="#{pessoaMB.login}" /> </h:panelGrid> </fieldset> </h:form></f:view></body></html>

web.xml (trecho relevante):

... <filter> <display-name>AuthFilter</display-name> <filter-name>AuthFilter</filter-name> <filter-class>br.com.serjaum.filtro.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>...

Importando o projeto

1. Baixe o projeto completo >>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.

Resultado