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

Este é o último post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, adicionarei a parte de autenticação, pois percebi nas listas e fóruns que esse é um problema comum, onde desenvolvedores se deparam frequentemente, por não se tratar de um problema trivial.

Na implementação usarei um Servlet Filter fazendo papel de um interceptador, que será executado a cada request e response. Ele verificará se o usuário pode se logar no sistema, caso contrário redirecionará o mesmo para uma página de login.

Estrutura do projeto

estrutura_final

Códigos

AuthFilter.jsp:

package br.com.serjaum.filtro;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AuthFilter implements Filter {

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 HttpServletRequest rq = (HttpServletRequest) request;
 HttpServletResponse rp = (HttpServletResponse) response;
 boolean auth = rq.getSession().getAttribute("user") != null;

 if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) {
 rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
 } else {

 try {
 chain.doFilter(request, response);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 }    

 public void destroy() {

 }

 public void init(FilterConfig config) throws ServletException {

 }
}

PessoaMB.jsp (trecho relevante):

public class PessoaMB implements Serializable {

 private static final long serialVersionUID = -333995781063775201L;

 private Pessoa pessoa = new Pessoa();

 private Long id;

 public PessoaMB(){
 System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do PESSOA_MB <<<<<<<<<<<<<<<<<<");

 if(this.pessoa == null){
 this.pessoa = new Pessoa();
 }
 }

 public String login() throws Exception{
 boolean logado = false;
 HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
 HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
 HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
 PessoaFacade pessoaService = new PessoaFacadeImpl();

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

 if(logado){
 session.setAttribute("user", logado);
 rp.sendRedirect(rq.getContextPath() + "/pages/index.jsf");
 return "success";
 }else{
 session.setAttribute("user", null);
 session.removeAttribute("user");
 rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
 return "failure";
 }
 }

 public String logout() {
 HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
 HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
 FacesContext facesContext = FacesContext.getCurrentInstance();
 HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
 session.invalidate();
 try {
 rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
 } catch (IOException e) {
 e.printStackTrace();
 }

 return "logoutOk";
 }
 ...

PessoaFacadeImpl.java (trecho relevante):

...
public boolean autentica(String email, String senha){
 boolean autenticado; 

 sf = new AnnotationConfiguration().configure().buildSessionFactory();
 session = sf.openSession();
 tx = session.beginTransaction();
 pessoaDAO = new PessoaDAO(session, Pessoa.class);

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

 tx.commit();
 session.close();

 return autenticado;
 }
...

PessoaDAO.java (trecho relevante):

...
public boolean verificaEmailSenha(String email, String senha){
 boolean valid = false;

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

 Query query = session.createQuery("from Pessoa p where p.email = :em and p.senha = :sen");
 query.setString("em", email);
 query.setString("sen", senha);

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

 if(pessoa != null){
 valid = true;
 }

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

 return valid;
 }
...

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" />
<script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script>
</head>

<body>
<f:view>
 <h:form>
 <rich:messages />
 <fieldset>
 <h:panelGrid columns="2">
 <h:outputText value="E-mail" styleClass="rotulos" />
 <h:inputText id="email" value="#{pessoaMB.pessoa.email}" styleClass="edit" size="90" style=" width : 150px;">
 <f:validator validatorId="emailValidator" />
 </h:inputText>    

 <h:outputLabel for="senha" value="Senha" styleClass="rotulos"/>
 <h:inputSecret id="senha" styleClass="edit" validatorMessage="A senha deve ter no mínimo 6 caracteres!" value="#{pessoaMB.pessoa.senha}" size="60" style=" width : 150px;">
 <f:validateLength minimum="6"/>
 </h:inputSecret>

 <a4j:commandButton id="botao" value="Entrar" action="#{pessoaMB.login}" />
 </h:panelGrid>
 </fieldset>
 </h:form>
</f:view>
</body>
</html>

web.xml (trecho relevante):

...
 <filter>
 <display-name>AuthFilter</display-name>
 <filter-name>AuthFilter</filter-name>
 <filter-class>br.com.serjaum.filtro.AuthFilter</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>AuthFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>
...

Importando o projeto

  1. Baixe o projeto completo >>aqui<<;
  2. Descompacte o projeto no seu workspace;
  3. No Eclipse vá em: File –> Import –> General – Existing Projects into Workspace –> Next –> Selecione o projeto descompactado no workspace –> Finish.

Criando o banco de dados

  1. Com o MySQL instalado e configurado com usuário: root e senha: root crie um novo schema com o nome de jsf.
  2. Execute a classe br.com.serjaum.util.GerarTabelas.java. Essa classe criará as tabelas que foram mapeadas no arquivo hibernate.cfg.xml, no caso a classe Pessoa terá uma tabela correspondente com o nome de pessoa no nosso banco de dados.

Resultado

login

Espero ter ajudado!


16 Comentários on “JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (Parte Final)”

  1. Mayara disse:

    Parabéns pelo tutorial, me ajudou mto a entender toda essa estrutura.

    Fica a sugestao de usar essa estrutura inicial com a interface swing, já procurei por diversos foruns e nao tem nada desse nivel.

    Abraços.

  2. […] por serjaumfantin em Setembro 3, 2009 Neste post irei fazer a migração da nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática para […]

  3. juniorsatanas disse:

    MONTRO TU É UM MONSTRO EM JSF.. 1 – CRUD QUE PEGA SEM FRESCURA..

    PARABÉNS MONSTRO

  4. Carlos Alberto da Silva disse:

    Sérgio, fiquei com muito feliz com este maraviloso tutorial. Este vai ser o modelo que pretendo seguir, porém ficou uma dúvida: como atualizar um registro sem que este seja acrescido novamente na tabela, pois comigo, é isto que está acontecendo.
    Aguardando esse resposta-ensinamento para que eu possa fechar o estudo com chave-de-ouro, agradeço antecipadamente.

  5. Thomas disse:

    Cara, muito bacana este tutorial.

    A um bom tempo eu lido com Struts e recentemente ando “namorando” JSF…

    Li muitos tutoriais na net sobre o assunto, e este tá muito prático, sem frescuras ou firulas.

  6. Walter Jr. disse:

    Oi tudo bem!

    Seguinte antes de mais nada quero parabenizar pelo projeto.
    Gostaria de saber como posso adionar o nome completo como boas vindas na pagina index depois do login…

    Poderia mandar para mim um exemplo? Eu fiz e deu certo esta mostrando o nome da pessoa na pagina, mas estam dizendo que esta errado… não sei como arrumar isso ….

    Agradeço pelos projetos
    Um abraço
    WJr
    Campo Grande -MS

  7. Francisco disse:

    Excelente tutorial amigo!

  8. Nei disse:

    muito legal seu artigo, eu gerei uma aplicação Blog dessa forma porém agora não sei como fazer o seguinte:

    Eu tenho uma relação nm entre Post e Category, o cadastro de post por default o hibernate não gera campos para este relacionamento, portanto acredito que deva ser feito na mão.

    Com base em uma relação 1xn eu adicionei a tag abaixo no meu cadastro de post

    e blz, agora ao cadastrar um posto eu marco no checkbox todas as categorias que o post pertence, porém não sei como fazer para salvar essa relação. ao postar esse form ele dá erro de validaçao pois não programei a relação entre as categorias e o post, acredito eu..

    Tem idéia de como fazer isso?

  9. serjaumfantin disse:

    Olá Nei!

    Coloque sua dúvida na lista de JSF que a gente tenta te ajudar: http://groups.google.com.br/group/javasf?pli=1

    Abraços…

  10. juniorsatanas disse:

    tentei por para gera um relatório nesse crud e nao vai .. como se faz ? como se faz o SelecOnMenu para salvar ?

    valeu

  11. Eduardo Mascari Filho disse:

    Como fazer para que só o registro de quem logou apareça ? como se fosse um painel de controle para alterar os dados apenas de quem logou … ?

  12. Tatiana disse:

    Ola,

    Muito bom material!

    Você tem algum material sobre este exemplo acima, mas eu utilizando pesquisas full text? Estou pesquisando isso há varios dias, mas não consigo achar algo que me ajude

    Obrigada

  13. Gmail disse:

    Seguinte Galera: Quando vou buscar um registro, por exemplo, a palavra Maria, e existe mais de uma Maria cadastrada, gera erro, pois veio mais que um registro. Alguem resolveu. Valeu

    • leonardo disse:

      Acredito que não dê para fazer isso pq ele retorna um uniqueResult e dentro do formulário já preenchido tbm…se fosse em uma lista normal, acredito eu que fazendo um cast e mudando para list(), traria uma lista de objetos do tipo pessoa para a tela…tbm vi isso aqui que vc falou, mas como estou aprendendo ainda, não posso dizer muita coisa sobre isso…e estudar o código para dar opinião, eu acho feio demais!!!
      parabéns para o autor pelo excelente trabalho…

  14. John Mendes disse:

    Olá Sérgio,

    Estou tentando usar seu exemplo mas ao rodar ele da um erro em:

    br.com.serjaum.filtro.AuthFilter.doFilter(AuthFilter.java:26)

    java.lang.IllegalStateException: Tentativa ilegal de definir ViewHandler depois de uma resposta ter sido renderizada

    Saberia me dizer o que poderia ser?


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s