jsf tutorial crud + hibernate + mysql
TRANSCRIPT
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("[email protected]");PESSOA_TESTE.setTelefoneCelular("(44) 8888-8888");
dao.save(PESSOA_TESTE);}
@Testpublic void testProcura() {
Pessoa buscada;
buscada = dao.load(PESSOA_TESTE.getId());
assertEquals(PESSOA_TESTE.getId(), buscada.getId());assertEquals(PESSOA_TESTE.getNome(),
buscada.getNome());assertEquals(PESSOA_TESTE.getEmail(),
buscada.getEmail());assertEquals(PESSOA_TESTE.getCpf(), buscada.getCpf());assertEquals(PESSOA_TESTE.getTelefoneCelular(),
buscada.getTelefoneCelular());assertEquals(PESSOA_TESTE.getDataNascimento(),
buscada.getDataNascimento());}
@Testpublic void testAtualiza(){
Pessoa buscadoParaAtualizacao; Pessoa buscadoAposAtualizacao;
buscadoParaAtualizacao = dao.load(PESSOA_TESTE.getId()); buscadoParaAtualizacao.setNome("Nome modificado");
buscadoParaAtualizacao.setEmail("[email protected]"); buscadoParaAtualizacao.setCpf("000.000.000-00"); buscadoParaAtualizacao.setTelefoneCelular("(00) 0000-
0000"); buscadoParaAtualizacao.setDataNascimento(new Date());
dao.merge(buscadoParaAtualizacao);
buscadoAposAtualizacao = dao.load(PESSOA_TESTE.getId()); assertEquals(buscadoParaAtualizacao.getId(),
buscadoAposAtualizacao.getId()); assertEquals(buscadoParaAtualizacao.getNome(),
buscadoAposAtualizacao.getNome()); assertEquals(buscadoParaAtualizacao.getEmail(),
buscadoAposAtualizacao.getEmail()); assertEquals(buscadoParaAtualizacao.getCpf(),
buscadoAposAtualizacao.getCpf()); assertEquals(buscadoParaAtualizacao.getTelefoneCelular(),
buscadoAposAtualizacao.getTelefoneCelular()); assertEquals(buscadoParaAtualizacao.getDataNascimento(),
buscadoAposAtualizacao.getDataNascimento());}
@Testpublic void testRemove(){
Pessoa pessoa = PESSOA_TESTE;pessoa.setId(1l);dao.delete(pessoa);
}}
Importando o projeto
1. Baixe o projeto atualizado >>aqui<<;2. Descompacte o projeto no seu workspace;
3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.
Executando o projeto
1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um novo schema com o nome de jsf.
2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados;
3. Para testar a camada DAO execute a classe br.com.serjaum.pessoa.test.PessoaTest.java.
Obs: o test irá executar as 4 operações CRUD. O último teste com a assinatura public void testRemove() removerá os registros gravados/atualizados pelos testes
anteriores. Caso não queira remover o registro testado comente o código do método testRemove() antes de executar o teste.
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
Espero ter ajudado!