JSF Tutorial CRUD + Hibernate + Mysql
JSF Tutorial CRUD + Hibernate + Mysql
Posted by serjaumfantin em julho 31, 2009 Esta a primeira parte da nossa aplicao JSF completa utilizando RichFaces + Hibernate + MySQL na prtica. Pretendo criar uma aplicao simples e ao mesmo tempo prtica ilustrando situaes do dia-a-dia. Utilizarei o Eclipse e o servlet continer Tomcat. A aplicao baseada em um cadastro de pessoas onde o usurio ter acesso a operaes de Create/Retrieve/Update/Delete. Utilizarei mscaras, conversores, validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros.
Verses utilizadas
Eclipse 3.4.1 JDK 1.6 Tomcat 6.0.18 MyFaces 1.2.5 RichFaces 3.3.1 Hibernate Annotations 3.4.0 Hibernate 3.3.1 MySQL 5 JUnit 4.5 Caelum Stella 1.2 MySQL Query Browser 1.2
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
Estrutura do projeto
Cdigos
DAO.java:
package br.com.serjaum.dao; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Session;
public class DAO { private static Logger logger = Logger.getLogger(DAO.class); private Class persistentClass; protected Session session; public DAO(Session session, Class persistentClass) { this.session = session; this.persistentClass = persistentClass; } @SuppressWarnings("unchecked") public T load(Long id) { logger.info("lendo " + persistentClass + " com id " + id); return (T) session.load(persistentClass, id); } public void save(T t) { logger.info("salvando session.save(t); " + t);
public void delete(T t) { logger.info("Deletando " + t); session.delete(t); } @SuppressWarnings("unchecked") public List list() { logger.info("Listando todos"); return session.createCriteria(persistentClass).list(); } public void merge(T t) { logger.info("Salvando ou atualizando " + t); session.merge(t); } }
PessoaDAO.java
package br.com.serjaum.dao; import java.util.List; import import import import import import org.apache.log4j.Logger; org.hibernate.Criteria; org.hibernate.Session; org.hibernate.criterion.Order; org.hibernate.criterion.Projections; org.hibernate.criterion.Restrictions;
import br.com.serjaum.modelo.Pessoa; public class PessoaDAO extends DAO<Pessoa>{ private Logger logger = Logger.getLogger(PessoaDAO.class); public PessoaDAO(Session session, Class<?> classe) {
super(session, classe); } public Pessoa pesquisaPessoaById(Long idPessoa) { logger.info("pesquisaPessoaById : " + idPessoa); return (Pessoa) session.load(Pessoa.class, idPessoa); } public String pesquisaPessoaByNome(String nome) { logger.info("pesquisaPessoaByNome : " + nome); Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike("nome", nome + "%")); c.addOrder(Order.asc("nome")); return (String)c.uniqueResult(); } public Pessoa pesquisaPessoaByEmail(String email) { logger.info("pesquisaPessoaByEmail : " + email); Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike("email", email + "%")); return (Pessoa)c.uniqueResult(); } public List<String> findByNameSuggest(String busca){ logger.info("findByNameSuggest : " + busca); Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike("nome", busca + "%")); c.addOrder(Order.asc("nome")); c.setProjection(Projections.property("nome")); return c.list(); } }
package br.com.serjaum.dao;import java.util.List;import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import br.com.serjaum.entidades.Pessoa; public class PessoaDAO { private Session session; private Logger logger = Logger.getLogger(PessoaDAO.class); public PessoaDAO(Session session) { logger.info(Construtor + session);
this.session = session; } public void insertPessoa(Pessoa pessoa) { session.saveOrUpdate(pessoa); } public void updatePessoa(Pessoa pessoa) { session.merge(pessoa); } public void deletePessoa(Pessoa pessoa) { session.delete(pessoa); } public Pessoa retrievePessoa(Pessoa pessoa) { return (Pessoa) session.load(Pessoa.class, pessoa.getId()); } public Pessoa retrievePessoaById(Long idPessoa) { return (Pessoa) session.load(Pessoa.class, idPessoa); } @SuppressWarnings(unchecked) public List<Pessoa> loadAll(){ Criteria c = session.createCriteria(Pessoa.class); c.addOrder(Order.asc(nome)); return c.list(); } public String retrievePessoaByNome(String nome) { Criteria c = session.createCriteria(Pessoa.class);
c.add(Restrictions.ilike(nome, nome + %)); c.addOrder(Order.asc(nome)); return (String)c.uniqueResult(); } public Pessoa retrievePessoaByEmail(String email) { Criteria c = session.createCriteria(Pessoa.class); c.add(Restrictions.ilike(email, email + %)); return (Pessoa)c.uniqueResult(); } } HibernateUtil.java
package br.com.serjaum.dao; import import import import org.apache.log4j.Logger; org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtil { private static final Logger logger = Logger.getLogger(HibernateUtil.class); private static final SessionFactory sessionFactory; private static ThreadLocal<Session> sessions = new ThreadLocal<Session>(); static { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } public static Session openSession() { if (sessions.get() != null) { logger.error("There was a session for this thread already!! "); // grave, alguem nao fechou uma sessao ja aberta! } sessions.set(sessionFactory.openSession()); return sessions.get(); } public static void closeCurrentSession() {
sessions.get().close(); sessions.set(null);
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name=""> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</proper ty> <property name="hibernate.connection.url">jdbc:mysql://localhost/jsf</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</pro perty> <property name="hibernate.format_sql">false</property> <property name="hibernate.show_sql">false</property> <property name="hibernate.hbm2ddl.auto">none</property> <property name="hibernate.c3p0.acquire_increment">1</property> <property name="hibernate.c3p0.idle_test_period">100</property> <property name="hibernate.c3p0.max_size">10</property> <property name="hibernate.c3p0.max_statements">0</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.timeout">100</property> <mapping class="br.com.serjaum.modelo.Pessoa"/> </session-factory> </hibernate-configuration>
xxx PessoaTest.java:
package br.com.serjaum.pessoa.test; import static org.junit.Assert.*; import java.util.Date; import import import import import import import org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.Transaction; org.hibernate.cfg.AnnotationConfiguration; org.junit.After; org.junit.Before; org.junit.Test;
import br.com.serjaum.dao.DAO; import br.com.serjaum.modelo.Pessoa; public class PessoaTest{ private static Pessoa PESSOA_TESTE = new Pessoa(); SessionFactory sf; Session session; Transaction tx; DAO<Pessoa> dao; @Before public void runBeforeEveryTest(){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); dao = new DAO<Pessoa>(session, Pessoa.class); } @After public void runAfterEveryTest(){ tx.commit(); session.close(); } @Test public void testCadastra(){ PESSOA_TESTE.setNome("Srgio Fantin"); PESSOA_TESTE.setCpf("123.456.789-10"); PESSOA_TESTE.setEmail("[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) 00000000"); buscadoParaAtualizacao.setDataNascimento(new Date()); dao.merge(buscadoParaAtualizacao); buscadoAposAtualizacao = dao.load(PESSOA_TESTE.getId()); assertEquals(buscadoParaAtualizacao.getId(), buscadoAposAtualizacao.getId()); assertEquals(buscadoParaAtualizacao.getNome(), buscadoAposAtualizacao.getNome()); assertEquals(buscadoParaAtualizacao.getEmail(), buscadoAposAtualizacao.getEmail()); assertEquals(buscadoParaAtualizacao.getCpf(), buscadoAposAtualizacao.getCpf()); assertEquals(buscadoParaAtualizacao.getTelefoneCelular(), buscadoAposAtualizacao.getTelefoneCelular()); assertEquals(buscadoParaAtualizacao.getDataNascimento(), buscadoAposAtualizacao.getDataNascimento()); } @Test public void testRemove(){ Pessoa pessoa = PESSOA_TESTE; pessoa.setId(1l); dao.delete(pessoa); } }
Importando o projeto
1. Baixe o projeto atualizado >>aqui<<; 2. Descompacte o projeto no seu workspace;
3. No Eclipse v em: File > Import > General Existing Projects into Workspace > Next > Selecione o projeto descompactado no workspace > Finish.
Executando o projeto
1. Com o MySQL instalado e configurado com usurio: root e senha: root crie um
novo schema com o nome de jsf. 2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criar as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa ter uma tabela correspondente com o nome de pessoa no nosso banco de dados; 3. Para testar a camada DAO execute a classe br.com.serjaum.pessoa.test.PessoaTest.java. Obs: o test ir executar as 4 operaes CRUD. O ltimo teste com a assinatura public void testRemove() remover os registros gravados/atualizados pelos testes anteriores. Caso no queira remover o registro testado comente o cdigo do mtodo testRemove() antes de executar o teste.
Resultado
Estrutura do projeto
Cdigos
BaseFacade.java:
package br.com.serjaum.facade; import java.io.Serializable; import java.util.List; public interface BaseFacade<T> extends Serializable { public abstract void salva(T t); public abstract void remove(T t); public abstract T procura(Long id); public abstract void atualiza(T t); } public abstract List<T> lista();
PessoaFacade.java:
package br.com.serjaum.facade; import java.util.List; import br.com.serjaum.modelo.Pessoa; public interface PessoaFacade extends BaseFacade<Pessoa>{ public void salva(Pessoa p); public void remove(Pessoa p); public Pessoa procura(Long id);
PessoaFacadeImpl.java:
package br.com.serjaum.facade; import import import import import import import java.util.List; org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.Transaction; org.hibernate.cfg.AnnotationConfiguration; br.com.serjaum.dao.PessoaDAO; br.com.serjaum.modelo.Pessoa;
public class PessoaFacadeImpl implements PessoaFacade { private private private private private static final long serialVersionUID = 1818242808424001885L; PessoaDAO pessoaDAO; SessionFactory sf; Session session; Transaction tx;
public void salva(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); this.pessoaDAO.save(p); tx.commit(); session.close(); } public void atualiza(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); this.pessoaDAO.merge(p); tx.commit(); session.close();
public Pessoa procura(Long id) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.load(id);
tx.commit(); session.close(); return p; } public void remove(Pessoa p) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); this.pessoaDAO.delete(p); tx.commit(); session.close();
public List<Pessoa> lista() { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); List<Pessoa> lista = this.pessoaDAO.list(); tx.commit(); session.close(); return lista; } public List<Pessoa> pesquisaPessoasByNome(String nome) { sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); List<Pessoa> lista = this.pessoaDAO.pesquisaPessoas(nome); tx.commit(); session.close(); } return lista;
public Pessoa procuraById(Long id){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.pesquisaPessoaById(id); tx.commit(); session.close();
return p;
public Pessoa procuraByNome(String nome){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.pesquisaPessoaByNome(nome); tx.commit(); session.close(); return p; } public Pessoa procuraByEmail(String email){ sf = new AnnotationConfiguration().configure().buildSessionFactory(); session = sf.openSession(); tx = session.beginTransaction(); pessoaDAO = new PessoaDAO(session, Pessoa.class); Pessoa p = this.pessoaDAO.pesquisaPessoaByEmail(email); tx.commit(); session.close(); } } return p;
Importando o projeto
1. Baixe o projeto atualizado >>aqui<<; 2. Descompacte o projeto no seu workspace;
3. No Eclipse v em: File > Import > General Existing Projects into Workspace > Next > Selecione o projeto descompactado no workspace > Finish.
tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa ter uma tabela correspondente com o nome de pessoa no nosso banco de dados; No prximo post eu irei codificar o nosso Managed Bean e os arquivos da camada de viso. At o prximo post!
Estrutura do projeto
Cdigos
PessoaMB.java:
package br.com.serjaum.mb; import java.io.Serializable; import java.util.List;
import br.com.serjaum.facade.PessoaFacade; import br.com.serjaum.facade.PessoaFacadeImpl; import br.com.serjaum.modelo.Pessoa; public class PessoaMB implements Serializable { private static final long serialVersionUID = -333995781063775201L; private Pessoa pessoa = new Pessoa(); private Long id; public PessoaMB(){ System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do PESSOA_MB <<<<<<<<<<<<<<<<<<"); if(this.pessoa == null){ this.pessoa = new Pessoa(); }
public String save(){ PessoaFacade pessoaService = new PessoaFacadeImpl(); pessoaService.salva(this.pessoa); this.pessoa = new Pessoa(); return "cadastraSucesso"; } public String delete(){ PessoaFacade pessoaService = new PessoaFacadeImpl(); this.pessoa.setId(id); pessoaService.remove(this.pessoa); this.pessoa = new Pessoa(); return "removeSucesso"; } public String merge(){ PessoaFacade pessoaService = new PessoaFacadeImpl(); pessoaService.atualiza(this.pessoa); this.pessoa = new Pessoa(); return "atualizaSucesso"; } public String load(){ PessoaFacade pessoaService = new PessoaFacadeImpl(); this.pessoa = pessoaService.procura(this.id); return "pesquisaSucesso"; } public String pesquisaByNome(){ PessoaFacadeImpl pessoaService = new PessoaFacadeImpl(); this.pessoa = pessoaService.procuraByNome(this.pessoa.getNome()); return "pesquisaByNomeSucesso"; } public List<Pessoa> getPessoas(){ PessoaFacade pessoaService = new PessoaFacadeImpl(); return pessoaService.lista(); } public List<Pessoa> getPessoasByNome(){
PessoaFacade pessoaService = new PessoaFacadeImpl(); List<Pessoa> lista = pessoaService.pesquisaPessoasByNome(this.pessoa.getNome()); return lista; } public Pessoa getPessoa() { return pessoa;
public void setPessoa(Pessoa pessoa) { this.pessoa = pessoa; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
atualizaPessoa.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <f:view> <h:form> <a4j:keepAlive beanName="pessoaMB" /> <fieldset><legend>Atualizao de Dados</legend> <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1"> <h:column> <f:facet name="header"> <h:outputText value="NOME" /> </f:facet> <h:outputText value="#{fisica.nome}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="E-MAIL" /> </f:facet> <h:outputText value="#{fisica.email}" /> </h:column>
<h:column> <f:facet name="header"> <h:outputText value="CPF" /> </f:facet> <h:outputText value="#{fisica.cpf}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="DATA NASC." /> </f:facet> <h:outputText value="#{fisica.dataNascimento}"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </h:column> <h:column> <f:facet name="header"> <h:outputText value="CELULAR" /> </f:facet> <h:outputText value="#{fisica.telefoneCelular}" /> </h:column> <h:column> <a4j:commandLink reRender="panelGridInputs"> <h:outputText value="Atualiza"/> <f:setPropertyActionListener value="#{fisica}" target="#{pessoaMB.pessoa}"/> </a4j:commandLink> </h:column> <f:facet name="footer"> <rich:datascroller /> </f:facet> </rich:dataTable> <h:panelGrid columns="2" id="panelGridInputs"> <h:outputLabel for="nome" value="Nome " /> <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/> <h:outputLabel for="email" value="E-mail " /> <h:inputText id="email" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/> <h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" validatorMessage="CPF invlido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/> <h:outputLabel for="dataNasc" value="Data Nascimento: " /> <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato invlido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText> <h:outputLabel for="telCel" value="Tel. Celular " <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}" /> />
<h:commandButton value="Salvar modificaes" action="#{pessoaMB.merge}"/> </h:panelGrid> </fieldset> </h:form> </f:view> </body> </html>
cadastraPessoa.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <f:view> <h:form> <h:messages/> <fieldset> <legend>Cadastro de Pessoa</legend> <h:panelGrid columns="2"> <h:outputLabel for="nome" value="Nome " /> <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" styleClass="edit" size="40" /> <h:outputLabel for="email" value="E-mail " /> <h:inputText id="email" value="#{pessoaMB.pessoa.email}" styleClass="edit" size="30" /> <h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" value="#{pessoaMB.pessoa.cpf}" styleClass="edit" size="11" /> <h:outputLabel for="dataNasc" value="Data Nascimento " /> <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato invlido!" value="#{pessoaMB.pessoa.dataNascimento}" styleClass="edit" size="10" > <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText> <h:outputLabel for="telCel" value="Tel. Celular " /> <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}" styleClass="edit" size="10" /> <h:commandButton value="Inserir" action="#{pessoaMB.save}" styleClass="botoes"/> </h:panelGrid>
pesquisaPessoa.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <f:view> <h:form> <a4j:keepAlive beanName="pessoaMB" /> <h:messages/> <fieldset> <legend>Pesquisa de Pessoas</legend> <h:panelGrid columns="2"> <h:outputLabel for="nomeLabel" value="Digite o nome: " /> <h:inputText id="nomeInput" value="#{pessoaMB.pessoa.nome}" style=" width : 321px;" /> <h:commandButton value="Pesquisar" action="#{pessoaMB.pesquisaByNome}"/> </h:panelGrid> <h:panelGrid columns="2" id="panelGridInputs"> <h:outputLabel for="nome" value="Nome " /> <h:inputText id="nome" readonly="true" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/> <h:outputLabel for="email" value="E-mail " /> <h:inputText id="email" readonly="true" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/> <h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" readonly="true" validatorMessage="CPF invlido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/> <h:outputLabel for="dataNasc" value="Data Nascimento: " /> <h:inputText id="dataNasc" readonly="true" validatorMessage="Data de nascimento com formato invlido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;"> <f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText> <h:outputLabel for="telCel" value="Tel. Celular " <h:inputText id="telCel" readonly="true" value="#{pessoaMB.pessoa.telefoneCelular}" /> </h:panelGrid> </fieldset> </h:form> </f:view> </body> </html> />
removePessoa.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <f:view> <h:form> <fieldset><legend>Remoo de Pessoas</legend> <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1"> <h:column> <f:facet name="header"> <h:outputText value="NOME" /> </f:facet> <h:outputText value="#{fisica.nome}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="E-MAIL" /> </f:facet> <h:outputText value="#{fisica.email}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="CPF" /> </f:facet> <h:outputText value="#{fisica.cpf}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="DATA NASC." /> </f:facet> <h:outputText value="#{fisica.dataNascimento}">
<f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </h:column> <h:column> <f:facet name="header"> <h:outputText value="CELULAR" /> </f:facet> <h:outputText value="#{fisica.telefoneCelular}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Excluso"/> </f:facet> <h:commandLink action="#{pessoaMB.delete}"> <h:outputText value="Excluir"/> <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaMB.id}" /> </h:commandLink> </h:column> <f:facet name="footer"> <rich:datascroller /> </f:facet> </rich:dataTable> </fieldset> </h:form> </f:view> </body> </html>
Importando o projeto
1. Baixe o projeto atualizado >>aqui<<; 2. Descompacte o projeto no seu workspace;
3. No Eclipse v em: File > Import > General Existing Projects into Workspace > Next > Selecione o projeto descompactado no workspace > Finish.
novo schema com o nome de jsf. 2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criar as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa ter uma tabela correspondente com o nome de pessoa no nosso banco de dados;
Prximas etapas
O nosso sistema j est funcionando, mas a interface dele no est muito amigvel para ser utilizada pelo usurio final. As quatro operaes CRUD esto codificadas e funcionando perfeitamente, ento nas prximas etapas irei adicionar regras de navegao, validadores, conversores, mscaras, CSS, etc. At o prximo post!
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> <script type="text/javascript" src="/jsf/resources/jquery.maskedinput1.2.1.js"></script> </head> <body> <f:view> <h:form> <h:messages /> <fieldset> <legend>Cadastro de Pessoas Fsicas</legend> <h:panelGrid> <h:commandLink value="Adicionar pessoa" action="toCadastraPessoa" /> <h:commandLink value="Pesquisar pessoa" action="toPesquisaPessoa" /> <h:commandLink value="Remover pessoa" action="toRemovePessoa" /> <h:commandLink value="Atualizar pessoa" action="toAtualizaPessoa" /> </h:panelGrid> </fieldset> </h:form> </f:view> </body> </html>
atualizaPessoa.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <%@ taglib prefix="stella" uri="http://stella.caelum.com.br/faces"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> <script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script> </head> <body> <f:view> <h:form> <a4j:keepAlive beanName="pessoaMB" /> <fieldset><legend>Atualizao de Dados</legend>
<rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1"> <h:column> <f:facet name="header"> <h:outputText value="NOME" /> </f:facet> <h:outputText value="#{fisica.nome}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="E-MAIL" /> </f:facet> <h:outputText value="#{fisica.email}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="CPF" /> </f:facet> <h:outputText value="#{fisica.cpf}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="DATA NASC." /> </f:facet> <h:outputText value="#{fisica.dataNascimento}"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </h:column> <h:column> <f:facet name="header"> <h:outputText value="CELULAR" /> </f:facet> <h:outputText value="#{fisica.telefoneCelular}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Excluso"/> </f:facet> <a4j:commandLink reRender="panelGridInputs"> <h:outputText value="Selecionar"/> <f:setPropertyActionListener value="#{fisica}" target="#{pessoaMB.pessoa}"/> </a4j:commandLink> </h:column> <f:facet name="footer"> <rich:datascroller /> </f:facet> </rich:dataTable> <rich:messages/> <a4j:region id="regiaoAjax">
<a4j:status id="sts"> <f:facet name="start"> <h:graphicImage value="/images/ajax-loader.gif" /> </f:facet> </a4j:status> </a4j:region> <h:panelGrid columns="2" id="panelGridInputs"> <h:outputLabel for="nome" value="Nome " /> <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/> <h:outputLabel for="email" value="E-mail " /> <h:inputText id="email" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"> <f:validator validatorId="emailValidator"/> </h:inputText> <h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" validatorMessage="CPF invlido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"> <rich:jQuery selector="#cpf" query="mask('999.999.999-99')" timing="onload"/> <stella:validateCPF formatted="true"/> </h:inputText> <h:outputLabel for="dataNasc" value="Data Nascimento: " /> <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato invlido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;"> <f:convertDateTime pattern="dd/MM/yyyy" /> <rich:jQuery selector="#dataNasc" query="mask('99/99/9999')" timing="onload"/> </h:inputText> <h:outputLabel for="telCel" value="Tel. Celular " /> <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}"> <rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')" timing="onload"/> </h:inputText> <a4j:commandButton value="Atualizar" action="#{pessoaMB.merge}" styleClass="botoes" status="sts" reRender="fisicas"/> <a4j:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/> </h:panelGrid> </fieldset> </h:form> </f:view> </body> </html>
cadastraPessoa.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>
<%@ taglib prefix="stella" uri="http://stella.caelum.com.br/faces"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> <script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script> </head> <body> <f:view> <h:form> <rich:messages/> <fieldset> <legend>Cadastro de Pessoa</legend> <a4j:region id="regiaoAjax"> <a4j:status id="sts"> <f:facet name="start"> <h:graphicImage value="/images/ajax-loader.gif" /> </f:facet> </a4j:status> </a4j:region> <h:panelGrid columns="2" id="inputs"> <h:outputLabel for="nome" value="Nome " /> <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" styleClass="edit" size="40" /> <h:outputLabel for="email" value="E-mail " /> <h:inputText id="email" value="#{pessoaMB.pessoa.email}" required="true" requiredMessage="Campo e-mail obrigatrio!" styleClass="edit" size="30"> <f:validator validatorId="emailValidator"/> </h:inputText> <h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" value="#{pessoaMB.pessoa.cpf}" styleClass="edit" size="11"> <rich:jQuery selector="#cpf" query="mask('999.999.999-99')" timing="onload"/> <stella:validateCPF formatted="true"/> </h:inputText> <h:outputLabel for="dataNasc" value="Data Nascimento " /> <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato invlido!" value="#{pessoaMB.pessoa.dataNascimento}" styleClass="edit" size="10" > <f:convertDateTime pattern="dd/MM/yyyy" /> <rich:jQuery selector="#dataNasc" query="mask('99/99/9999')" timing="onload"/> </h:inputText> <h:outputLabel for="telCel" value="Tel. Celular " /> <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}" styleClass="edit" size="10">
<rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')" timing="onload"/> </h:inputText> <a4j:commandButton value="Inserir" action="#{pessoaMB.save}" status="sts" reRender="inputs" styleClass="botoes"/> <a4j:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/> </h:panelGrid> </fieldset> </h:form> </f:view> </body> </html>
pesquisaPessoa.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> </head> <body> <f:view> <h:form> <a4j:keepAlive beanName="pessoaMB" /> <h:messages/> <fieldset> <legend>Pesquisa de Pessoas</legend> <h:panelGrid columns="2"> <h:outputLabel for="nomeLabel" value="Digite o nome: " /> <h:inputText id="nomeInput" value="#{pessoaMB.pessoa.nome}" style=" width : 321px;" /> <h:commandButton value="Pesquisar" action="#{pessoaMB.pesquisaByNome}" styleClass="botoes"/> <h:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/> </h:panelGrid> <h:panelGrid columns="2" id="panelGridInputs"> <h:outputLabel for="nome" value="Nome " /> <h:inputText id="nome" readonly="true" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/> <h:outputLabel for="email" value="E-mail " />
<h:inputText id="email" readonly="true" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/> <h:outputLabel for="cpf" value="CPF " /> <h:inputText id="cpf" readonly="true" validatorMessage="CPF invlido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/> <h:outputLabel for="dataNasc" value="Data Nascimento: " /> <h:inputText id="dataNasc" readonly="true" validatorMessage="Data de nascimento com formato invlido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText> <h:outputLabel for="telCel" value="Tel. Celular " <h:inputText id="telCel" readonly="true" value="#{pessoaMB.pessoa.telefoneCelular}" /> </h:panelGrid> </fieldset> </h:form> </f:view> </body> </html> />
removePessoa.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> </head> <body> <f:view> <h:form> <fieldset><legend>Remoo de Pessoas</legend> <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1"> <h:column> <f:facet name="header"> <h:outputText value="NOME" /> </f:facet> <h:outputText value="#{fisica.nome}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="E-MAIL" />
</f:facet> <h:outputText value="#{fisica.email}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="CPF" /> </f:facet> <h:outputText value="#{fisica.cpf}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="DATA NASC." /> </f:facet> <h:outputText value="#{fisica.dataNascimento}"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </h:column> <h:column> <f:facet name="header"> <h:outputText value="CELULAR" /> </f:facet> <h:outputText value="#{fisica.telefoneCelular}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Excluso"/> </f:facet> <a4j:commandLink action="#{pessoaMB.delete}" status="sts" reRender="fisicas" > <h:outputText value="Excluir"/> <f:setPropertyActionListener value="#{fisica.id}" target="#{pessoaMB.id}" /> </a4j:commandLink> </h:column> <f:facet name="footer"> <rich:datascroller /> </f:facet> </rich:dataTable> <a4j:region id="regiaoAjax"> <a4j:status id="sts"> <f:facet name="start"> <h:graphicImage value="/images/ajax-loader.gif" /> </f:facet> </a4j:status> </a4j:region> <h:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/> </fieldset> </h:form> </f:view> </body> </html>
Navigation Rules
Importando o projeto
1. Baixe o projeto atualizado >>aqui<<; 2. Descompacte o projeto no seu workspace;
3. No Eclipse v em: File > Import > General Existing Projects into Workspace > Next > Selecione o projeto descompactado no workspace > Finish.
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
Estrutura do projeto
Cdigos
AuthFilter.jsp:
package br.com.serjaum.filtro; import java.io.IOException; import import import import import import javax.servlet.Filter; javax.servlet.FilterChain; javax.servlet.FilterConfig; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AuthFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest rq = (HttpServletRequest) request; HttpServletResponse rp = (HttpServletResponse) response; boolean auth = rq.getSession().getAttribute("user") != null; if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) { rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf"); } else { try { chain.doFilter(request, response); } catch (Exception e) { e.printStackTrace(); } } } public void destroy() { } public void init(FilterConfig config) throws ServletException { } }
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"; } ...
System.out.println("DAO metodo isValidLoginAndPassword..."); System.out.println("DAO session.isOpen() >>> " + session.isOpen()); Query query = session.createQuery("from Pessoa p where p.email = :em and p.senha = :sen"); query.setString("em", email); query.setString("sen", senha); Pessoa pessoa = (Pessoa) query.uniqueResult(); if(pessoa != null){ valid = true; } System.out.println("DAO Pessoa >>> " + pessoa); return valid; } ...
login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" /> <script type="text/javascript" src="/jsf/resources/jquery.maskedinput1.2.1.js"></script> </head> <body> <f:view> <h:form> <rich:messages /> <fieldset> <h:panelGrid columns="2"> <h:outputText value="E-mail" styleClass="rotulos" /> <h:inputText id="email" value="#{pessoaMB.pessoa.email}" styleClass="edit" size="90" style=" width : 150px;"> <f:validator validatorId="emailValidator" /> </h:inputText> <h:outputLabel for="senha" value="Senha" styleClass="rotulos"/> <h:inputSecret id="senha" styleClass="edit" validatorMessage="A senha deve ter no mnimo 6 caracteres!" value="#{pessoaMB.pessoa.senha}" size="60" style=" width : 150px;"> <f:validateLength minimum="6"/> </h:inputSecret>
<a4j:commandButton id="botao" value="Entrar" action="#{pessoaMB.login}" /> </h:panelGrid> </fieldset> </h:form> </f:view> </body> </html>
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.
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