jsf tutorial crud + hibernate + mysql

50

Click here to load reader

Upload: carlos-eduardo-bellincanta

Post on 31-Dec-2015

106 views

Category:

Documents


12 download

TRANSCRIPT

Page 1: JSF Tutorial CRUD + Hibernate + Mysql

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

Posted by serjaumfantin em julho 31, 2009

Esta é a primeira parte da nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática. Pretendo criar uma aplicação simples e ao mesmo tempo prática ilustrando situações do dia-a-dia. Utilizarei o Eclipse e o servlet contêiner Tomcat.

A aplicação é baseada em um cadastro de pessoas onde o usuário terá acesso a operações de Create/Retrieve/Update/Delete. Utilizarei máscaras, conversores, validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros.

Versões utilizadas

Eclipse 3.4.1 JDK 1.6

Tomcat 6.0.18

MyFaces 1.2.5

RichFaces 3.3.1

Hibernate Annotations 3.4.0

Hibernate 3.3.1

MySQL 5

JUnit 4.5

Caelum Stella 1.2

MySQL Query Browser 1.2

Estrutura inicial do projeto

Page 2: JSF Tutorial CRUD + Hibernate + Mysql

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!

Page 3: JSF Tutorial CRUD + Hibernate + Mysql

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;

Page 4: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 5: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 6: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 7: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 8: JSF Tutorial CRUD + Hibernate + Mysql

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;

Page 9: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 10: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 11: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 12: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 13: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 14: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 15: JSF Tutorial CRUD + Hibernate + Mysql

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!

Page 16: JSF Tutorial CRUD + Hibernate + Mysql

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;

Page 17: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 18: JSF Tutorial CRUD + Hibernate + Mysql

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>

Page 19: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 20: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 21: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 22: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 23: JSF Tutorial CRUD + Hibernate + Mysql

<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

Page 24: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 25: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 26: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 27: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 28: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 29: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 30: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 31: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 32: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 33: JSF Tutorial CRUD + Hibernate + Mysql
Page 34: JSF Tutorial CRUD + Hibernate + Mysql
Page 35: JSF Tutorial CRUD + Hibernate + Mysql
Page 36: JSF Tutorial CRUD + Hibernate + Mysql

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.

Page 37: JSF Tutorial CRUD + Hibernate + Mysql

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;

Page 38: JSF Tutorial CRUD + Hibernate + Mysql

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

Page 39: JSF Tutorial CRUD + Hibernate + Mysql

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;

Page 40: JSF Tutorial CRUD + Hibernate + Mysql

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>

Page 41: JSF Tutorial CRUD + Hibernate + Mysql

<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

Page 43: JSF Tutorial CRUD + Hibernate + Mysql