jsf + hibernate na prática

44
JSF Tutorial RichFaces + Hibernate + MySQL CRUD completo (parte 1) Posted by Sergio Fantin em julho 31, 2009 Esta é a primeira parte da nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática. Pretendo criar uma aplicação simples e ao mesmo tempo prática ilustrando situações do dia-a-dia. Utilizarei o Eclipse e o servlet contêiner Tomcat . A aplicação é baseada em um cadastro de pessoas onde o usuário terá acesso a operações de Create/Retrieve/Update/Delete. Utilizarei máscaras, conversores, validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros. Versões utilizadas Eclipse 3.4.1 JDK 1.6 Tomcat 6.0.18 MyFaces 1.2.5 RichFaces 3.3.1 Hibernate Annotations 3.4.0 Hibernate 3.3.1 MySQL 5 JUnit 4.5 Caelum Stella 1.2 MySQL Query Browser 1.2 Estrutura inicial do projeto

Upload: gustavoinfot

Post on 28-Nov-2014

742 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: JSF + Hibernate na prática

JSF – Tutorial RichFaces + Hibernate + MySQL –

CRUD completo (parte 1)

Posted by Sergio Fantin em julho 31, 2009

Esta é a primeira parte da nossa aplicação JSF completa

utilizando RichFaces + Hibernate + MySQL na prática. Pretendo criar uma aplicação

simples e ao mesmo tempo prática ilustrando situações do dia-a-dia. Utilizarei

o Eclipse e o servlet contêiner Tomcat.

A aplicação é baseada em um cadastro de pessoas onde o usuário terá acesso a

operações de Create/Retrieve/Update/Delete. Utilizarei máscaras, conversores,

validadores e componentes com suporte a AJAX(RichFaces), CSS entre outros.

Versões utilizadas

Eclipse 3.4.1

JDK 1.6

Tomcat 6.0.18

MyFaces 1.2.5

RichFaces 3.3.1

Hibernate Annotations 3.4.0

Hibernate 3.3.1

MySQL 5

JUnit 4.5

Caelum Stella 1.2

MySQL Query Browser 1.2

Estrutura inicial do projeto

Page 2: JSF + Hibernate na prática

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 + Hibernate na prática

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

Posted by Sergio Fantin em agosto 1, 2009

Este é o segundo post referente à nossa aplicação JSF completa

utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei a

camada DAO (Data Access Object) que é responsável por isolar a camada superior do

acesso aos dados. Na maioria dos casos teremos uma classe DAO para cada classe do

domínio do sistema. Na classe DAO estão os métodos fundamentais para persistência e

na classe PessoaDAO temos os métodos específicos de manipulação de dados

referente à classe Pessoa mais os métodos da classe DAO que são obtidos por herança.

Estrutura do projeto

Códigos

DAO.java:

package br.com.serjaum.dao;

import java.util.List;

Page 4: JSF + Hibernate na prática

import org.apache.log4j.Logger;

import org.hibernate.Session;

public class DAO {

private static Logger logger = Logger.getLogger(DAO.class);

private Class persistentClass;

protected Session session;

public DAO(Session session, Class persistentClass) {

this.session = session;

this.persistentClass = persistentClass;

}

@SuppressWarnings("unchecked")

public T load(Long id) {

logger.info("lendo " + persistentClass + " com id " + id);

return (T) session.load(persistentClass, id);

}

public void save(T t) {

logger.info("salvando " + t);

session.save(t);

}

public void delete(T t) {

logger.info("Deletando " + t);

session.delete(t);

}

@SuppressWarnings("unchecked")

public List list() {

logger.info("Listando todos");

return session.createCriteria(persistentClass).list();

}

public void merge(T t) {

logger.info("Salvando ou atualizando " + t);

session.merge(t);

}

}

PessoaDAO.java

package br.com.serjaum.dao;

import java.util.List;

import org.apache.log4j.Logger;

import org.hibernate.Criteria;

import org.hibernate.Session;

import org.hibernate.criterion.Order;

import org.hibernate.criterion.Projections;

import org.hibernate.criterion.Restrictions;

import br.com.serjaum.modelo.Pessoa;

public class PessoaDAO extends DAO<Pessoa>{

private Logger logger = Logger.getLogger(PessoaDAO.class);

Page 5: JSF + Hibernate na prática

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

Page 6: JSF + Hibernate na prática

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

Page 7: JSF + Hibernate na prática

return c.list();

}

public String retrievePessoaByNome(String nome) {

Criteria c = session.createCriteria(Pessoa.class);

c.add(Restrictions.ilike(“nome”, nome + “%”));

c.addOrder(Order.asc(“nome”));

return (String)c.uniqueResult();

}

public Pessoa retrievePessoaByEmail(String email) {

Criteria c = session.createCriteria(Pessoa.class);

c.add(Restrictions.ilike(“email”, email + “%”));

return (Pessoa)c.uniqueResult();

}

}

HibernateUtil.java

package br.com.serjaum.dao;

import org.apache.log4j.Logger;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

private static final Logger logger =

Logger.getLogger(HibernateUtil.class);

private static final SessionFactory sessionFactory;

private static ThreadLocal<Session> sessions = new

ThreadLocal<Session>();

static {

sessionFactory = new

AnnotationConfiguration().configure().buildSessionFactory();

}

Page 8: JSF + Hibernate na prática

public static Session openSession() {

if (sessions.get() != null) {

logger.error("There was a session for this

thread already!! ");

// grave, alguem nao fechou uma sessao ja

aberta!

}

sessions.set(sessionFactory.openSession());

return sessions.get();

}

public static void closeCurrentSession() {

sessions.get().close();

sessions.set(null);

}

public static Session currentSession() {

return sessions.get();

}

}

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate

Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory name="">

<property

name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</proper

ty>

<property

name="hibernate.connection.url">jdbc:mysql://localhost/jsf</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.connection.password">root</property>

<property

name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</pro

perty>

<property name="hibernate.format_sql">false</property>

<property name="hibernate.show_sql">false</property>

<property name="hibernate.hbm2ddl.auto">none</property>

<property name="hibernate.c3p0.acquire_increment">1</property>

<property name="hibernate.c3p0.idle_test_period">100</property>

<property name="hibernate.c3p0.max_size">10</property>

<property name="hibernate.c3p0.max_statements">0</property>

<property name="hibernate.c3p0.min_size">5</property>

<property name="hibernate.c3p0.timeout">100</property>

<mapping class="br.com.serjaum.modelo.Pessoa"/>

</session-factory>

</hibernate-configuration>

xxx

PessoaTest.java:

package br.com.serjaum.pessoa.test;

Page 9: JSF + Hibernate na prática

import static org.junit.Assert.*;

import java.util.Date;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.AnnotationConfiguration;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import br.com.serjaum.dao.DAO;

import br.com.serjaum.modelo.Pessoa;

public class PessoaTest{

private static Pessoa PESSOA_TESTE = new Pessoa();

SessionFactory sf;

Session session;

Transaction tx;

DAO<Pessoa> dao;

@Before

public void runBeforeEveryTest(){

sf = new

AnnotationConfiguration().configure().buildSessionFactory();

session = sf.openSession();

tx = session.beginTransaction();

dao = new DAO<Pessoa>(session, Pessoa.class);

}

@After

public void runAfterEveryTest(){

tx.commit();

session.close();

}

@Test

public void testCadastra(){

PESSOA_TESTE.setNome("Sérgio Fantin");

PESSOA_TESTE.setCpf("123.456.789-10");

PESSOA_TESTE.setEmail("[email protected]");

PESSOA_TESTE.setTelefoneCelular("(44) 8888-8888");

dao.save(PESSOA_TESTE);

}

@Test

public void testProcura() {

Pessoa buscada;

buscada = dao.load(PESSOA_TESTE.getId());

assertEquals(PESSOA_TESTE.getId(), buscada.getId());

assertEquals(PESSOA_TESTE.getNome(),

buscada.getNome());

assertEquals(PESSOA_TESTE.getEmail(),

buscada.getEmail());

assertEquals(PESSOA_TESTE.getCpf(), buscada.getCpf());

Page 10: JSF + Hibernate na prática

assertEquals(PESSOA_TESTE.getTelefoneCelular(),

buscada.getTelefoneCelular());

assertEquals(PESSOA_TESTE.getDataNascimento(),

buscada.getDataNascimento());

}

@Test

public void testAtualiza(){

Pessoa buscadoParaAtualizacao;

Pessoa buscadoAposAtualizacao;

buscadoParaAtualizacao = dao.load(PESSOA_TESTE.getId());

buscadoParaAtualizacao.setNome("Nome modificado");

buscadoParaAtualizacao.setEmail("[email protected]");

buscadoParaAtualizacao.setCpf("000.000.000-00");

buscadoParaAtualizacao.setTelefoneCelular("(00) 0000-

0000");

buscadoParaAtualizacao.setDataNascimento(new Date());

dao.merge(buscadoParaAtualizacao);

buscadoAposAtualizacao = dao.load(PESSOA_TESTE.getId());

assertEquals(buscadoParaAtualizacao.getId(),

buscadoAposAtualizacao.getId());

assertEquals(buscadoParaAtualizacao.getNome(),

buscadoAposAtualizacao.getNome());

assertEquals(buscadoParaAtualizacao.getEmail(),

buscadoAposAtualizacao.getEmail());

assertEquals(buscadoParaAtualizacao.getCpf(),

buscadoAposAtualizacao.getCpf());

assertEquals(buscadoParaAtualizacao.getTelefoneCelular(),

buscadoAposAtualizacao.getTelefoneCelular());

assertEquals(buscadoParaAtualizacao.getDataNascimento(),

buscadoAposAtualizacao.getDataNascimento());

}

@Test

public void testRemove(){

Pessoa pessoa = PESSOA_TESTE;

pessoa.setId(1l);

dao.delete(pessoa);

}

}

Importando o projeto

1. Baixe o projeto atualizado >>aqui<<;

2. Descompacte o projeto no seu workspace;

3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace

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

Executando o projeto

1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um

novo schema com o nome de jsf.

2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as

tabelas que foram mapeadas no arquivohibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no

nosso banco de dados;

Page 11: JSF + Hibernate na prática

3. Para testar a camada DAO execute a

classe br.com.serjaum.pessoa.test.PessoaTest.java.

Obs: o test irá executar as 4 operações CRUD. O último teste com a assinatura public

void testRemove() removerá os registros gravados/atualizados pelos testes

anteriores. Caso não queira remover o registro testado comente o código do

método testRemove() antes de executar o teste.

Resultado

Continuarei o próximo post desenvolvendo a camada de visão da aplicação. Até o

próximo post!

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

Posted by Sergio Fantin em agosto 18, 2009

Este é o terceiro post referente à nossa aplicação JSF completa

utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei a camada

de Façade que é responsável por abstrair a camada de negócios, que contribuirá para a

redução do acoplamento entre as camadas da aplicação. Essa camada tem a função de

receber solicitações de operações e repassá-las para os métodos de

negócio/persistência que estão em outras camadas, mantendo a arquitetura coerente e

aumentando a manutenabilidade da aplicação.

Page 12: JSF + Hibernate na prática

Obs: por se tratar de um tutorial prático, preferi simplificar a aplicação adicionando a

camada de Façade de uma maneira simples, por isso fiz o gerenciamento de

sessões/transações dentro da classe PessoaFacadeImpl.java. O ideal seria retirar esse

código de abertura/fechamento de sessões/transações e colocá-lo em um filtro, por

exemplo: Open Session In View. Isso é aplicado quando utilizamos um Servlet

Contêiner como o Tomcat ou Jetty, mas se o deploy for feito em um Servidor de

Aplicação (JBoss, GlassFish, etc) o gerenciamento fica por conta do mesmo, daí é só

alegria (ou não?!).

Estrutura do projeto

Códigos

BaseFacade.java:

package br.com.serjaum.facade;

import java.io.Serializable;

import java.util.List;

public interface BaseFacade<T> extends Serializable {

public abstract void salva(T t);

public abstract void remove(T t);

public abstract T procura(Long id);

public abstract void atualiza(T t);

Page 13: JSF + Hibernate na prática

public abstract List<T> lista();

}

PessoaFacade.java:

package br.com.serjaum.facade;

import java.util.List;

import br.com.serjaum.modelo.Pessoa;

public interface PessoaFacade extends BaseFacade<Pessoa>{

public void salva(Pessoa p);

public void remove(Pessoa p);

public Pessoa procura(Long id);

public void atualiza(Pessoa p);

public List<Pessoa> pesquisaPessoasByNome(String nome);

}

PessoaFacadeImpl.java:

package br.com.serjaum.facade;

import java.util.List;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.AnnotationConfiguration;

import br.com.serjaum.dao.PessoaDAO;

import br.com.serjaum.modelo.Pessoa;

public class PessoaFacadeImpl implements PessoaFacade {

private static final long serialVersionUID = 1818242808424001885L;

private PessoaDAO pessoaDAO;

private SessionFactory sf;

private Session session;

private Transaction tx;

public void salva(Pessoa p) {

sf = new

AnnotationConfiguration().configure().buildSessionFactory();

session = sf.openSession();

tx = session.beginTransaction();

pessoaDAO = new PessoaDAO(session, Pessoa.class);

this.pessoaDAO.save(p);

tx.commit();

session.close();

}

public void atualiza(Pessoa p) {

sf = new

AnnotationConfiguration().configure().buildSessionFactory();

session = sf.openSession();

Page 14: JSF + Hibernate na prática

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

Page 15: JSF + Hibernate na prática

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.

Page 16: JSF + Hibernate na prática

Criando o banco de dados

1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um

novo schema com o nome de jsf.

2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as

tabelas que foram mapeadas no arquivohibernate.cfg.xml, no caso a

classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados;

No próximo post eu irei codificar o nosso Managed Bean e os arquivos da camada de

visão.

Até o próximo post!

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

Posted by Sergio Fantin em agosto 19, 2009

Este é o quarto post referente à nossa aplicação JSF completa

utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei o Managed

Bean, que é a classe que receberá as solicitações da camada de visão (JSP), e as

encaminhará para a camada de Façade. Nesta etapa o sistema já entrará em

funcionamento com suas operações CRUD básicas.

Estrutura do projeto

Page 17: JSF + Hibernate na prática

Códigos

PessoaMB.java:

package br.com.serjaum.mb;

import java.io.Serializable;

import java.util.List;

import br.com.serjaum.facade.PessoaFacade;

import br.com.serjaum.facade.PessoaFacadeImpl;

import br.com.serjaum.modelo.Pessoa;

public class PessoaMB implements Serializable {

private static final long serialVersionUID = -333995781063775201L;

private Pessoa pessoa = new Pessoa();

private Long id;

public PessoaMB(){

System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do

PESSOA_MB <<<<<<<<<<<<<<<<<<");

if(this.pessoa == null){

this.pessoa = new Pessoa();

}

}

Page 18: JSF + Hibernate na prática

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;

Page 19: JSF + Hibernate na prática

}

}

atualizaPessoa.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<f:view>

<h:form>

<a4j:keepAlive beanName="pessoaMB" />

<fieldset><legend>Atualização de Dados</legend>

<rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10"

id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1">

<h:column>

<f:facet name="header">

<h:outputText value="NOME" />

</f:facet>

<h:outputText value="#{fisica.nome}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="E-MAIL" />

</f:facet>

<h:outputText value="#{fisica.email}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CPF" />

</f:facet>

<h:outputText value="#{fisica.cpf}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="DATA NASC." />

</f:facet>

<h:outputText value="#{fisica.dataNascimento}">

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

</h:outputText>

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CELULAR" />

</f:facet>

Page 20: JSF + Hibernate na prática

<h:outputText value="#{fisica.telefoneCelular}" />

</h:column>

<h:column>

<a4j:commandLink reRender="panelGridInputs">

<h:outputText value="Atualiza"/>

<f:setPropertyActionListener value="#{fisica}"

target="#{pessoaMB.pessoa}"/>

</a4j:commandLink>

</h:column>

<f:facet name="footer">

<rich:datascroller />

</f:facet>

</rich:dataTable>

<h:panelGrid columns="2" id="panelGridInputs">

<h:outputLabel for="nome" value="Nome " />

<h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" style=" width

: 254px;"/>

<h:outputLabel for="email" value="E-mail " />

<h:inputText id="email" value="#{pessoaMB.pessoa.email}" style="

width : 249px;"/>

<h:outputLabel for="cpf" value="CPF " />

<h:inputText id="cpf" validatorMessage="CPF inválido!"

value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/>

<h:outputLabel for="dataNasc" value="Data Nascimento: " />

<h:inputText id="dataNasc" validatorMessage="Data de nascimento com

formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60"

style=" width : 75px;">

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

</h:inputText>

<h:outputLabel for="telCel" value="Tel. Celular " />

<h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}"

/>

<h:commandButton value="Salvar modificações"

action="#{pessoaMB.merge}"/>

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

cadastraPessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

Page 21: JSF + Hibernate na prática

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<f:view>

<h:form>

<h:messages/>

<fieldset>

<legend>Cadastro de Pessoa</legend>

<h:panelGrid columns="2">

<h:outputLabel for="nome" value="Nome " />

<h:inputText id="nome" value="#{pessoaMB.pessoa.nome}"

styleClass="edit" size="40" />

<h:outputLabel for="email" value="E-mail " />

<h:inputText id="email" value="#{pessoaMB.pessoa.email}"

styleClass="edit" size="30" />

<h:outputLabel for="cpf" value="CPF " />

<h:inputText id="cpf" value="#{pessoaMB.pessoa.cpf}"

styleClass="edit" size="11" />

<h:outputLabel for="dataNasc" value="Data Nascimento " />

<h:inputText id="dataNasc" validatorMessage="Data de nascimento com

formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}"

styleClass="edit" size="10" >

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

</h:inputText>

<h:outputLabel for="telCel" value="Tel. Celular " />

<h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}"

styleClass="edit" size="10" />

<h:commandButton value="Inserir" action="#{pessoaMB.save}"

styleClass="botoes"/>

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

pesquisaPessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Page 22: JSF + Hibernate na prática

</head>

<body>

<f:view>

<h:form>

<a4j:keepAlive beanName="pessoaMB" />

<h:messages/>

<fieldset>

<legend>Pesquisa de Pessoas</legend>

<h:panelGrid columns="2">

<h:outputLabel for="nomeLabel" value="Digite o nome: " />

<h:inputText id="nomeInput" value="#{pessoaMB.pessoa.nome}" style="

width : 321px;" />

<h:commandButton value="Pesquisar"

action="#{pessoaMB.pesquisaByNome}"/>

</h:panelGrid>

<h:panelGrid columns="2" id="panelGridInputs">

<h:outputLabel for="nome" value="Nome " />

<h:inputText id="nome" readonly="true"

value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/>

<h:outputLabel for="email" value="E-mail " />

<h:inputText id="email" readonly="true"

value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/>

<h:outputLabel for="cpf" value="CPF " />

<h:inputText id="cpf" readonly="true" validatorMessage="CPF

inválido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width :

106px;"/>

<h:outputLabel for="dataNasc" value="Data Nascimento: " />

<h:inputText id="dataNasc" readonly="true" validatorMessage="Data de

nascimento com formato inválido!"

value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width :

75px;">

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

</h:inputText>

<h:outputLabel for="telCel" value="Tel. Celular " />

<h:inputText id="telCel" readonly="true"

value="#{pessoaMB.pessoa.telefoneCelular}" />

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

removePessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

Page 23: JSF + Hibernate na prática

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<f:view>

<h:form>

<fieldset><legend>Remoção de Pessoas</legend>

<rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10"

id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1">

<h:column>

<f:facet name="header">

<h:outputText value="NOME" />

</f:facet>

<h:outputText value="#{fisica.nome}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="E-MAIL" />

</f:facet>

<h:outputText value="#{fisica.email}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CPF" />

</f:facet>

<h:outputText value="#{fisica.cpf}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="DATA NASC." />

</f:facet>

<h:outputText value="#{fisica.dataNascimento}">

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

</h:outputText>

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CELULAR" />

</f:facet>

<h:outputText value="#{fisica.telefoneCelular}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="Exclusão"/>

</f:facet>

<h:commandLink action="#{pessoaMB.delete}">

<h:outputText value="Excluir"/>

<f:setPropertyActionListener value="#{fisica.id}"

target="#{pessoaMB.id}" />

Page 24: JSF + Hibernate na prática

</h:commandLink>

</h:column>

<f:facet name="footer">

<rich:datascroller />

</f:facet>

</rich:dataTable>

</fieldset>

</h:form>

</f:view>

</body>

</html>

Importando o projeto

1. Baixe o projeto atualizado >>aqui<<;

2. Descompacte o projeto no seu workspace;

3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.

Criando o banco de dados

1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um

novo schema com o nome de jsf.

2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as

tabelas que foram mapeadas no arquivohibernate.cfg.xml, no caso a

classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados;

Próximas etapas

O nosso sistema já está funcionando, mas a interface dele não está muito amigável

para ser utilizada pelo usuário final. As quatro operações CRUD estão codificadas e

funcionando perfeitamente, então nas próximas etapas irei adicionar regras de

navegação, validadores, conversores, máscaras, CSS, etc.

Até o próximo post!

Page 25: JSF + Hibernate na prática

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

Posted by Sergio Fantin em agosto 25, 2009

Este é o quinto post referente à nossa aplicação JSF completa

utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da parte visual da nossa aplicação, adicionarei

as regras de navegação, CSS, máscaras para os campos, validadores, conversores e

Ajax.

Estrutura do projeto

Códigos

index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css"

media="screen" />

Page 26: JSF + Hibernate na prática

<script type="text/javascript" src="/jsf/resources/jquery.maskedinput-

1.2.1.js"></script>

</head>

<body>

<f:view>

<h:form>

<h:messages />

<fieldset>

<legend>Cadastro de Pessoas Físicas</legend>

<h:panelGrid>

<h:commandLink value="Adicionar pessoa"

action="toCadastraPessoa" />

<h:commandLink value="Pesquisar pessoa"

action="toPesquisaPessoa" />

<h:commandLink value="Remover pessoa" action="toRemovePessoa"

/>

<h:commandLink value="Atualizar pessoa"

action="toAtualizaPessoa" />

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

atualizaPessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<%@ taglib prefix="stella" uri="http://stella.caelum.com.br/faces"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css"

media="screen" />

<script type="text/javascript"

src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script>

</head>

<body>

<f:view>

<h:form>

<a4j:keepAlive beanName="pessoaMB" />

<fieldset><legend>Atualização de Dados</legend>

<rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10"

id="fisicas"

width="100%" cellspacing="0" cellpadding="0" border="1">

<h:column>

<f:facet name="header">

<h:outputText value="NOME" />

</f:facet>

<h:outputText value="#{fisica.nome}" />

Page 27: JSF + Hibernate na prática

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="E-MAIL" />

</f:facet>

<h:outputText value="#{fisica.email}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CPF" />

</f:facet>

<h:outputText value="#{fisica.cpf}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="DATA NASC." />

</f:facet>

<h:outputText value="#{fisica.dataNascimento}">

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

</h:outputText>

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CELULAR" />

</f:facet>

<h:outputText value="#{fisica.telefoneCelular}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="Exclusão"/>

</f:facet>

<a4j:commandLink reRender="panelGridInputs">

<h:outputText value="Selecionar"/>

<f:setPropertyActionListener value="#{fisica}"

target="#{pessoaMB.pessoa}"/>

</a4j:commandLink>

</h:column>

<f:facet name="footer">

<rich:datascroller />

</f:facet>

</rich:dataTable>

<rich:messages/>

<a4j:region id="regiaoAjax">

<a4j:status id="sts">

<f:facet name="start">

<h:graphicImage value="/images/ajax-loader.gif" />

</f:facet>

</a4j:status>

</a4j:region>

<h:panelGrid columns="2" id="panelGridInputs">

Page 28: JSF + Hibernate na prática

<h:outputLabel for="nome" value="Nome " />

<h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" style=" width

: 254px;"/>

<h:outputLabel for="email" value="E-mail " />

<h:inputText id="email" value="#{pessoaMB.pessoa.email}" style="

width : 249px;">

<f:validator validatorId="emailValidator"/>

</h:inputText>

<h:outputLabel for="cpf" value="CPF " />

<h:inputText id="cpf" validatorMessage="CPF inválido!"

value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;">

<rich:jQuery selector="#cpf" query="mask('999.999.999-99')"

timing="onload"/>

<stella:validateCPF formatted="true"/>

</h:inputText>

<h:outputLabel for="dataNasc" value="Data Nascimento: " />

<h:inputText id="dataNasc" validatorMessage="Data de nascimento com

formato inválido!"

value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width

: 75px;">

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

<rich:jQuery selector="#dataNasc" query="mask('99/99/9999')"

timing="onload"/>

</h:inputText>

<h:outputLabel for="telCel" value="Tel. Celular " />

<h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}">

<rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')"

timing="onload"/>

</h:inputText>

<a4j:commandButton value="Atualizar" action="#{pessoaMB.merge}"

styleClass="botoes" status="sts" reRender="fisicas"/>

<a4j:commandButton value="Voltar" immediate="true" action="toIndex"

styleClass="botoes"/>

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

cadastraPessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="stella" uri="http://stella.caelum.com.br/faces"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Page 29: JSF + Hibernate na prática

<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css"

media="screen" />

<script type="text/javascript"

src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script>

</head>

<body>

<f:view>

<h:form>

<rich:messages/>

<fieldset>

<legend>Cadastro de Pessoa</legend>

<a4j:region id="regiaoAjax">

<a4j:status id="sts">

<f:facet name="start">

<h:graphicImage value="/images/ajax-loader.gif" />

</f:facet>

</a4j:status>

</a4j:region>

<h:panelGrid columns="2" id="inputs">

<h:outputLabel for="nome" value="Nome " />

<h:inputText id="nome" value="#{pessoaMB.pessoa.nome}"

styleClass="edit" size="40" />

<h:outputLabel for="email" value="E-mail " />

<h:inputText id="email" value="#{pessoaMB.pessoa.email}"

required="true" requiredMessage="Campo e-mail obrigatório!"

styleClass="edit" size="30">

<f:validator validatorId="emailValidator"/>

</h:inputText>

<h:outputLabel for="cpf" value="CPF " />

<h:inputText id="cpf" value="#{pessoaMB.pessoa.cpf}"

styleClass="edit" size="11">

<rich:jQuery selector="#cpf" query="mask('999.999.999-99')"

timing="onload"/>

<stella:validateCPF formatted="true"/>

</h:inputText>

<h:outputLabel for="dataNasc" value="Data Nascimento " />

<h:inputText id="dataNasc" validatorMessage="Data de nascimento com

formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}"

styleClass="edit" size="10" >

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

<rich:jQuery selector="#dataNasc" query="mask('99/99/9999')"

timing="onload"/>

</h:inputText>

<h:outputLabel for="telCel" value="Tel. Celular " />

<h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}"

styleClass="edit" size="10">

<rich:jQuery selector="#telCel" query="mask('(99) 9999-9999')"

timing="onload"/>

</h:inputText>

<a4j:commandButton value="Inserir" action="#{pessoaMB.save}"

status="sts" reRender="inputs" styleClass="botoes"/>

<a4j:commandButton value="Voltar" immediate="true" action="toIndex"

styleClass="botoes"/>

Page 30: JSF + Hibernate na prática

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

pesquisaPessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css"

media="screen" />

</head>

<body>

<f:view>

<h:form>

<a4j:keepAlive beanName="pessoaMB" />

<h:messages/>

<fieldset>

<legend>Pesquisa de Pessoas</legend>

<h:panelGrid columns="2">

<h:outputLabel for="nomeLabel" value="Digite o nome: " />

<h:inputText id="nomeInput" value="#{pessoaMB.pessoa.nome}" style="

width : 321px;" />

<h:commandButton value="Pesquisar"

action="#{pessoaMB.pesquisaByNome}" styleClass="botoes"/>

<h:commandButton value="Voltar" immediate="true" action="toIndex"

styleClass="botoes"/>

</h:panelGrid>

<h:panelGrid columns="2" id="panelGridInputs">

<h:outputLabel for="nome" value="Nome " />

<h:inputText id="nome" readonly="true"

value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/>

<h:outputLabel for="email" value="E-mail " />

<h:inputText id="email" readonly="true"

value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/>

<h:outputLabel for="cpf" value="CPF " />

<h:inputText id="cpf" readonly="true" validatorMessage="CPF

inválido!" value="#{pessoaMB.pessoa.cpf}"

size="60" style=" width : 106px;"/>

<h:outputLabel for="dataNasc" value="Data Nascimento: " />

Page 31: JSF + Hibernate na prática

<h:inputText id="dataNasc" readonly="true" validatorMessage="Data de

nascimento com formato inválido!"

value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width :

75px;">

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

</h:inputText>

<h:outputLabel for="telCel" value="Tel. Celular " />

<h:inputText id="telCel" readonly="true"

value="#{pessoaMB.pessoa.telefoneCelular}" />

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

removePessoa.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css"

media="screen" />

</head>

<body>

<f:view>

<h:form>

<fieldset><legend>Remoção de Pessoas</legend>

<rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10"

id="fisicas"

width="100%" cellspacing="0" cellpadding="0" border="1">

<h:column>

<f:facet name="header">

<h:outputText value="NOME" />

</f:facet>

<h:outputText value="#{fisica.nome}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="E-MAIL" />

</f:facet>

<h:outputText value="#{fisica.email}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CPF" />

</f:facet>

<h:outputText value="#{fisica.cpf}" />

Page 32: JSF + Hibernate na prática

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="DATA NASC." />

</f:facet>

<h:outputText value="#{fisica.dataNascimento}">

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

</h:outputText>

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="CELULAR" />

</f:facet>

<h:outputText value="#{fisica.telefoneCelular}" />

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="Exclusão"/>

</f:facet>

<a4j:commandLink action="#{pessoaMB.delete}" status="sts"

reRender="fisicas" >

<h:outputText value="Excluir"/>

<f:setPropertyActionListener value="#{fisica.id}"

target="#{pessoaMB.id}" />

</a4j:commandLink>

</h:column>

<f:facet name="footer">

<rich:datascroller />

</f:facet>

</rich:dataTable>

<a4j:region id="regiaoAjax">

<a4j:status id="sts">

<f:facet name="start">

<h:graphicImage value="/images/ajax-loader.gif" />

</f:facet>

</a4j:status>

</a4j:region>

<h:commandButton value="Voltar" immediate="true" action="toIndex"

styleClass="botoes"/>

</fieldset>

</h:form>

</f:view>

</body>

</html>

Navigation Rules

Page 33: JSF + Hibernate na prática

Importando o projeto

1. Baixe o projeto atualizado >>aqui<<;

2. Descompacte o projeto no seu workspace;

3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.

Criando o banco de dados

1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um

novo schema com o nome de jsf.

2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as

tabelas que foram mapeadas no arquivohibernate.cfg.xml, no caso a

classe Pessoa terá uma tabela correspondente com o nome de pessoa no

nosso banco de dados.

Resultado

Page 34: JSF + Hibernate na prática
Page 35: JSF + Hibernate na prática
Page 36: JSF + Hibernate na prática
Page 37: JSF + Hibernate na prática
Page 38: JSF + Hibernate na prática

Espero ter ajudado!

JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (Parte Final)

Posted by Sergio Fantin em agosto 27, 2009

Este é o último post referente à nossa aplicação JSF completa

utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, adicionarei a parte de

autenticação, pois percebi nas listas e fóruns que esse é um problema comum, onde

desenvolvedores se deparam frequentemente, por não se tratar de um problema trivial.

Page 39: JSF + Hibernate na prática

Na implementação usarei um Servlet Filter fazendo papel de um interceptador, que

será executado a cada request e response. Ele verificará se o usuário pode se logar no

sistema, caso contrário redirecionará o mesmo para uma página de login.

Estrutura do projeto

Códigos

AuthFilter.jsp:

package br.com.serjaum.filtro;

import java.io.IOException;

Page 40: JSF + Hibernate na prática

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class AuthFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse

response, FilterChain chain) throws IOException, ServletException {

HttpServletRequest rq = (HttpServletRequest) request;

HttpServletResponse rp = (HttpServletResponse) response;

boolean auth = rq.getSession().getAttribute("user") != null;

if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) {

rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");

} else {

try {

chain.doFilter(request, response);

} catch (Exception e) {

e.printStackTrace();

}

}

}

public void destroy() {

}

public void init(FilterConfig config) throws ServletException {

}

}

PessoaMB.jsp (trecho relevante):

public class PessoaMB implements Serializable {

private static final long serialVersionUID = -333995781063775201L;

private Pessoa pessoa = new Pessoa();

private Long id;

public PessoaMB(){

System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do PESSOA_MB

<<<<<<<<<<<<<<<<<<");

if(this.pessoa == null){

this.pessoa = new Pessoa();

}

}

public String login() throws Exception{

boolean logado = false;

Page 41: JSF + Hibernate na prática

HttpSession session = (HttpSession)

FacesContext.getCurrentInstance().getExternalContext().getSession(fals

e);

HttpServletResponse rp = (HttpServletResponse)

FacesContext.getCurrentInstance().getExternalContext().getResponse();

HttpServletRequest rq = (HttpServletRequest)

FacesContext.getCurrentInstance().getExternalContext().getRequest();

PessoaFacade pessoaService = new PessoaFacadeImpl();

logado = pessoaService.autentica(this.pessoa.getEmail(),

this.pessoa.getSenha());

if(logado){

session.setAttribute("user", logado);

rp.sendRedirect(rq.getContextPath() + "/pages/index.jsf");

return "success";

}else{

session.setAttribute("user", null);

session.removeAttribute("user");

rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");

return "failure";

}

}

public String logout() {

HttpServletRequest rq = (HttpServletRequest)

FacesContext.getCurrentInstance().getExternalContext().getRequest();

HttpServletResponse rp = (HttpServletResponse)

FacesContext.getCurrentInstance().getExternalContext().getResponse();

FacesContext facesContext = FacesContext.getCurrentInstance();

HttpSession session = (HttpSession)

facesContext.getExternalContext().getSession(false);

session.invalidate();

try {

rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");

} catch (IOException e) {

e.printStackTrace();

}

return "logoutOk";

}

...

PessoaFacadeImpl.java (trecho relevante):

...

public boolean autentica(String email, String senha){

boolean autenticado;

sf = new AnnotationConfiguration().configure().buildSessionFactory();

session = sf.openSession();

tx = session.beginTransaction();

pessoaDAO = new PessoaDAO(session, Pessoa.class);

autenticado = this.pessoaDAO.verificaEmailSenha(email, senha);

tx.commit();

session.close();

return autenticado;

}

Page 42: JSF + Hibernate na prática

...

PessoaDAO.java (trecho relevante):

...

public boolean verificaEmailSenha(String email, String senha){

boolean valid = false;

System.out.println("DAO metodo isValidLoginAndPassword...");

System.out.println("DAO session.isOpen() >>> " + session.isOpen());

Query query = session.createQuery("from Pessoa p where p.email = :em

and p.senha = :sen");

query.setString("em", email);

query.setString("sen", senha);

Pessoa pessoa = (Pessoa) query.uniqueResult();

if(pessoa != null){

valid = true;

}

System.out.println("DAO Pessoa >>> " + pessoa);

return valid;

}

...

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>

<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css"

media="screen" />

<script type="text/javascript" src="/jsf/resources/jquery.maskedinput-

1.2.1.js"></script>

</head>

<body>

<f:view>

<h:form>

<rich:messages />

<fieldset>

<h:panelGrid columns="2">

<h:outputText value="E-mail" styleClass="rotulos" />

<h:inputText id="email" value="#{pessoaMB.pessoa.email}"

styleClass="edit" size="90" style=" width : 150px;">

<f:validator validatorId="emailValidator" />

</h:inputText>

<h:outputLabel for="senha" value="Senha" styleClass="rotulos"/>

Page 43: JSF + Hibernate na prática

<h:inputSecret id="senha" styleClass="edit" validatorMessage="A senha

deve ter no mínimo 6 caracteres!" value="#{pessoaMB.pessoa.senha}"

size="60" style=" width : 150px;">

<f:validateLength minimum="6"/>

</h:inputSecret>

<a4j:commandButton id="botao" value="Entrar"

action="#{pessoaMB.login}" />

</h:panelGrid>

</fieldset>

</h:form>

</f:view>

</body>

</html>

web.xml (trecho relevante):

...

<filter>

<display-name>AuthFilter</display-name>

<filter-name>AuthFilter</filter-name>

<filter-class>br.com.serjaum.filtro.AuthFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>AuthFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

...

Importando o projeto

1. Baixe o projeto completo >>aqui<<;

2. Descompacte o projeto no seu workspace;

3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace

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

Criando o banco de dados

1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um

novo schema com o nome de jsf.

2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as

tabelas que foram mapeadas no arquivohibernate.cfg.xml, no caso a

classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados.

Resultado

Page 44: JSF + Hibernate na prática

Espero ter ajudado!