78410311 JSF Tutorial CRUD Hibernate Mysql

Post on 02-Jan-2016

75 views 0 download

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

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!

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;

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

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

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;

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("sergio.lnd.fantin@gmail.com");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");

buscadoParaAtualizacao.setEmail("email@modificado.com"); 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.

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

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

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

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

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;

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

public class PessoaMB implements Serializable {

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

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

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

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

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

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

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

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

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

public List<Pessoa> getPessoasByNome(){

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

public Pessoa getPessoa() { return pessoa; }

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

public Long getId() { return id; }

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

atualizaPessoa.jsp

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

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

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

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

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

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

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

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

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

</h:column>

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

</rich:dataTable>

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

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

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

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

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

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

</h:panelGrid> </fieldset>

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

cadastraPessoa.jsp:

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

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

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

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

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

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

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

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

<h:commandButton value="Inserir" action="#{pessoaMB.save}" styleClass="botoes"/> </h:panelGrid>

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

pesquisaPessoa.jsp:

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

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

<body><f:view>

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

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

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

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

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

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

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

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

</h:inputText>

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

removePessoa.jsp:

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

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

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

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

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

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

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

<f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </h:column>

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

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

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

</h:column>

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

</rich:dataTable> </fieldset>

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

Importando o projeto

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

Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.

Criando o banco de dados

1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um novo schema com o nome de jsf.

2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados;

Próximas etapas

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

Até o próximo post!

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

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

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

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

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

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

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

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

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.

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;

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

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

<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