JSF – Tutorial RichFaces + Hibernate + MySQL –
CRUD completo (parte 1)
Posted by Sergio Fantin 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 Sergio Fantin 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</proper
ty>
<property
name="hibernate.connection.url">jdbc:mysql://localhost/jsf</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property
name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</pro
perty>
<property name="hibernate.format_sql">false</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.hbm2ddl.auto">none</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">100</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">100</property>
<mapping class="br.com.serjaum.modelo.Pessoa"/>
</session-factory>
</hibernate-configuration>
xxx
PessoaTest.java:
package br.com.serjaum.pessoa.test;
import static org.junit.Assert.*;
import java.util.Date;
import 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;
@Before
public void runBeforeEveryTest(){
sf = new
AnnotationConfiguration().configure().buildSessionFactory();
session = sf.openSession();
tx = session.beginTransaction();
dao = new DAO<Pessoa>(session, Pessoa.class);
}
@After
public void runAfterEveryTest(){
tx.commit();
session.close();
}
@Test
public void testCadastra(){
PESSOA_TESTE.setNome("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);
}
@Test
public void testProcura() {
Pessoa buscada;
buscada = dao.load(PESSOA_TESTE.getId());
assertEquals(PESSOA_TESTE.getId(), buscada.getId());
assertEquals(PESSOA_TESTE.getNome(),
buscada.getNome());
assertEquals(PESSOA_TESTE.getEmail(),
buscada.getEmail());
assertEquals(PESSOA_TESTE.getCpf(), buscada.getCpf());
assertEquals(PESSOA_TESTE.getTelefoneCelular(),
buscada.getTelefoneCelular());
assertEquals(PESSOA_TESTE.getDataNascimento(),
buscada.getDataNascimento());
}
@Test
public void testAtualiza(){
Pessoa buscadoParaAtualizacao;
Pessoa buscadoAposAtualizacao;
buscadoParaAtualizacao = dao.load(PESSOA_TESTE.getId());
buscadoParaAtualizacao.setNome("Nome modificado");
buscadoParaAtualizacao.setEmail("[email 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());
}
@Test
public void testRemove(){
Pessoa pessoa = PESSOA_TESTE;
pessoa.setId(1l);
dao.delete(pessoa);
}
}
Importando o projeto
1. Baixe o projeto atualizado >>aqui<<;
2. Descompacte o projeto no seu workspace;
3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace
–> Next –> Selecione o projeto descompactado no workspace –> Finish.
Executando o projeto
1. Com o MySQL instalado e configurado com 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 arquivohibernate.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 Sergio Fantin 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 arquivohibernate.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 Sergio Fantin 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 arquivohibernate.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 Sergio Fantin 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 arquivohibernate.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 Sergio Fantin 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(fals
e);
HttpServletResponse rp = (HttpServletResponse)
FacesContext.getCurrentInstance().getExternalContext().getResponse();
HttpServletRequest rq = (HttpServletRequest)
FacesContext.getCurrentInstance().getExternalContext().getRequest();
PessoaFacade pessoaService = new PessoaFacadeImpl();
logado = pessoaService.autentica(this.pessoa.getEmail(),
this.pessoa.getSenha());
if(logado){
session.setAttribute("user", logado);
rp.sendRedirect(rq.getContextPath() + "/pages/index.jsf");
return "success";
}else{
session.setAttribute("user", null);
session.removeAttribute("user");
rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
return "failure";
}
}
public String logout() {
HttpServletRequest rq = (HttpServletRequest)
FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpServletResponse rp = (HttpServletResponse)
FacesContext.getCurrentInstance().getExternalContext().getResponse();
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession)
facesContext.getExternalContext().getSession(false);
session.invalidate();
try {
rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
} catch (IOException e) {
e.printStackTrace();
}
return "logoutOk";
}
...
PessoaFacadeImpl.java (trecho relevante):
...
public boolean autentica(String email, String senha){
boolean autenticado;
sf = new AnnotationConfiguration().configure().buildSessionFactory();
session = sf.openSession();
tx = session.beginTransaction();
pessoaDAO = new PessoaDAO(session, Pessoa.class);
autenticado = this.pessoaDAO.verificaEmailSenha(email, senha);
tx.commit();
session.close();
return autenticado;
}
...
PessoaDAO.java (trecho relevante):
...
public boolean verificaEmailSenha(String email, String senha){
boolean valid = false;
System.out.println("DAO metodo isValidLoginAndPassword...");
System.out.println("DAO session.isOpen() >>> " + session.isOpen());
Query query = session.createQuery("from Pessoa p where p.email = :em
and p.senha = :sen");
query.setString("em", email);
query.setString("sen", senha);
Pessoa pessoa = (Pessoa) query.uniqueResult();
if(pessoa != null){
valid = true;
}
System.out.println("DAO Pessoa >>> " + pessoa);
return valid;
}
...
login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css"
media="screen" />
<script type="text/javascript" src="/jsf/resources/jquery.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 arquivohibernate.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!
Top Related