Você está na página 1de 42

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

Posted by serjaumfantin em julho 31, 2009 Esta a primeira parte da nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Pretendo criar uma aplicao simples e ao mesmo tempo prtica ilustrando situaes do dia-a-dia. Utilizarei o Eclipse e o servlet continer Tomcat. A aplicao baseada em um cadastro de pessoas onde o usurio ter acesso a operaes de Create/Retrieve/Update/Delete. Utilizarei mscaras, conversores, validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros.

Verses 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

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 prximo post desenvolvendo a camada de persistncia da aplicao. At o prximo post!

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


Posted by serjaumfantin em agosto 1, 2009 Este o segundo post referente nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da nossa aplicao, codificarei a camada DAO (Data Access Object) que responsvel por isolar a camada superior do acesso aos dados. Na maioria dos casos teremos uma classe DAO para cada classe do domnio do sistema. Na classe DAO esto os mtodos fundamentais para persistncia e na classe PessoaDAO temos os mtodos especficos de manipulao de dados referente classe Pessoa mais os mtodos da classe DAO que so obtidos por herana.

Estrutura do projeto

Cdigos
DAO.java:
package br.com.serjaum.dao; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Session;

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 session.save(t); " + 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 import import import import import org.apache.log4j.Logger; org.hibernate.Criteria; org.hibernate.Session; org.hibernate.criterion.Order; org.hibernate.criterion.Projections; 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) {

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

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

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 import import import org.apache.log4j.Logger; org.hibernate.Session; org.hibernate.SessionFactory; 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() {

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</proper ty> <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</pro perty> <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 import import import import import import org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.Transaction; org.hibernate.cfg.AnnotationConfiguration; org.junit.After; org.junit.Before; org.junit.Test;

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; @Before public void runBeforeEveryTest(){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); dao = new DAO<Pessoa>(session, Pessoa.class); } @After public void runAfterEveryTest(){ tx.commit(); session.close(); } @Test public void testCadastra(){ PESSOA_TESTE.setNome("Srgio Fantin"); PESSOA_TESTE.setCpf("123.456.789-10"); PESSOA_TESTE.setEmail("sergio.lnd.fantin@gmail.com"); PESSOA_TESTE.setTelefoneCelular("(44) 8888-8888"); } dao.save(PESSOA_TESTE);

@Test public 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()); } @Test public void testAtualiza(){ Pessoa buscadoParaAtualizacao; Pessoa buscadoAposAtualizacao; buscadoParaAtualizacao = dao.load(PESSOA_TESTE.getId()); buscadoParaAtualizacao.setNome("Nome modificado");

buscadoParaAtualizacao.setEmail("email@modificado.com"); buscadoParaAtualizacao.setCpf("000.000.000-00"); buscadoParaAtualizacao.setTelefoneCelular("(00) 00000000"); 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()); } @Test public 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 usurio: 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 operaes CRUD. O ltimo teste com a assinatura public void testRemove() remover os registros gravados/atualizados pelos testes anteriores. Caso no queira remover o registro testado comente o cdigo do mtodo testRemove() antes de executar o teste.

Resultado

Continuarei o prximo post desenvolvendo a camada de viso da aplicao. At o prximo post!

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


Posted by serjaumfantin em agosto 18, 2009 Este o terceiro post referente nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da nossa aplicao, codificarei a camada de Faade que responsvel por abstrair a camada de negcios, que contribuir para a reduo do acoplamento entre as camadas da aplicao. Essa camada tem a funo de receber solicitaes de operaes e repass-las para os mtodos de negcio/persistncia que esto em outras camadas, mantendo a arquitetura coerente e aumentando a manutenabilidade da aplicao. Obs: por se tratar de um tutorial prtico, preferi simplificar a aplicao adicionando a camada de Faade de uma maneira simples, por isso fiz o gerenciamento de sesses/transaes dentro da classe PessoaFacadeImpl.java. O ideal seria retirar esse cdigo de abertura/fechamento de sesses/transaes e coloc-lo em um filtro, por exemplo: Open Session In View. Isso aplicado quando utilizamos um Servlet Continer como o Tomcat ou Jetty, mas se o deploy for feito em um Servidor de Aplicao (JBoss, GlassFish, etc) o gerenciamento fica por conta do mesmo, da s alegria (ou no?!).

Estrutura do projeto

Cdigos
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);

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

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

public class PessoaFacadeImpl implements PessoaFacade { private private private private private static final long serialVersionUID = 1818242808424001885L; PessoaDAO pessoaDAO; SessionFactory sf; Session session; 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);

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

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 usurio: 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 prximo post eu irei codificar o nosso Managed Bean e os arquivos da camada de viso. At o prximo post!

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


Posted by serjaumfantin em agosto 19, 2009 Este o quarto post referente nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da nossa aplicao, codificarei o Managed Bean, que a classe que receber as solicitaes da camada de viso (JSP), e as encaminhar para a camada de Faade. Nesta etapa o sistema j entrar em funcionamento com suas operaes CRUD bsicas.

Estrutura do projeto

Cdigos
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>Atualizao 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 invlido!" 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 invlido!" 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 modificaes" 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 invlido!" 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 invlido!" 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 invlido!" 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>Remoo 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="Excluso"/> </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 usurio: 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;

Prximas etapas

O nosso sistema j est funcionando, mas a interface dele no est muito amigvel para ser utilizada pelo usurio final. As quatro operaes CRUD esto codificadas e funcionando perfeitamente, ento nas prximas etapas irei adicionar regras de navegao, validadores, conversores, mscaras, CSS, etc. At o prximo post!

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


Posted by serjaumfantin em agosto 25, 2009 Este o quinto post referente nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da parte visual da nossa aplicao, adicionarei as regras de navegao, CSS, mscaras para os campos, validadores, conversores e Ajax.

Estrutura do projeto Cdigos


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

<!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.maskedinput1.2.1.js"></script> </head> <body> <f:view> <h:form> <h:messages /> <fieldset> <legend>Cadastro de Pessoas Fsicas</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>Atualizao 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> <f:facet name="header"> <h:outputText value="Excluso"/> </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">

<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 invlido!" 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 invlido!" 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"%>

<%@ 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 obrigatrio!" 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 invlido!" 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">

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

<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 invlido!" 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 invlido!" 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>Remoo 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="Excluso"/> </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>

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

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 aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Dando continuidade ao desenvolvimento da nossa aplicao, adicionarei a parte de autenticao, pois percebi nas listas e fruns que esse um problema comum, onde desenvolvedores se deparam frequentemente, por no se tratar de um problema trivial. Na implementao usarei um Servlet Filter fazendo papel de um interceptador, que ser executado a cada request e response. Ele verificar se o usurio pode se logar no sistema, caso contrrio redirecionar o mesmo para uma pgina de login.

Estrutura do projeto

Cdigos
AuthFilter.jsp:
package br.com.serjaum.filtro; import java.io.IOException; import import import import import import javax.servlet.Filter; javax.servlet.FilterChain; javax.servlet.FilterConfig; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse;

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(fals e); HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); PessoaFacade pessoaService = new PessoaFacadeImpl();

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;

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.maskedinput1.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 mnimo 6 caracteres!" value="#{pessoaMB.pessoa.senha}" size="60" style=" width : 150px;"> <f:validateLength minimum="6"/> </h:inputSecret>

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

Espero ter ajudado!