Você está na página 1de 8

CRUD JSF 2.

0 + Hibernate Exemplo
Gerenciando Livros
Este blog possui um novo domnio agora jamacedo.com, clique aqui para acess-lo!
Bom dia a todos!
Hoje vou apresentar todos os passos necessrios para a construo de um CRUD (Create, Read,
Update and Delete) utilizando Java Server Faces 2.0 para facilitar a criao das pginas e a
comunicao destas com as classes Java e Hibernate para realizar a persistncia dos dados.
Para o desenvolvimento eu utilizei o Netbeans 6.8 que j conta com suporte ao JSF 2.0 e ao Hibernate 3
facilitando o trabalho de baixar os frameworks e coloca-los no projeto, porm, fica a cargo do desenvolvedor
escolher a IDE de sua preferncia para a criao!
O exemplo para a criao do CRUD ser dado atravs da gerencia de livros, um exemplo simples mas capaz de
mostrar como as operaes bsicas de um sistema podem ser efetuadas com JSF.
A segunda parte deste CRUD com utilizao de ajax e da biblioteca de componentes PrimeFaces est disponvel
aqui!
Pr Requisitos
- Netbeans ou Eclipse
- JSF 2.0
- Hibernate 3
- MySQL
Estrutura do CRUD
O nosso CRUD segue o padro MVC para programao Web, separando as classes em camadas de acordo com
a responsabilidade de cada uma. Abaixo apresentada a estrutura que criaremos onde Dao, Model, Controller e
View sero pacotes do projeto.
Cada livro no CRUD ter as seguintes informaes: ttulo, autor, pginas, editora, isbn e avaliao que sero
mantidas no banco de dados.
Criando o Banco de Dados
O CRUD utilizar Banco de Dados MySQL, para isso, crie um squema e uma tabela no seu banco como est
descrito abaixo.
Squema
Tabela
8
06
2010
1 CREATE DATABASE IF NOT EXISTS livraria;
1
2
3
4
5
CREATE TABLE `livro` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`autor` varchar(255) DEFAULT NULL,
`avaliacao` int(11) NOT NULL,
`editora` varchar(255) DEFAULT NULL,
Criando as Camadas
Model
O pacote Model do projeto deve conter uma classe chamada Livro que ser um POJO (Plain Old Java Object) com
as annotations do hibernate necessrias para utilizao do framework. A classe deve ficar de acordo com esta:
6
7
8
9
10
`isbn` varchar(255) DEFAULT NULL,
`paginas` int(11) NOT NULL,
`titulo` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package Model;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
*
* @author Jos Alexandre
*/
@Entity
public class Livro implements Serializable {

@Id
@GeneratedValue
private long id;
private String titulo;
private String autor;
private int paginas;
private String editora;
private String isbn;
private int avaliacao;

public Livro() {
}

public Livro(long id, String titulo, String autor, int paginas, String editora, String isbn,
this.id = id;
this.titulo = titulo;
this.autor = autor;
this.paginas = paginas;
this.editora = editora;
this.isbn = isbn;
this.avaliacao = avaliacao;
}

public String getAutor() {
return autor;
}

public void setAutor(String autor) {
this.autor = autor;
}

public int getAvaliacao() {
return avaliacao;
}

public void setAvaliacao(int avaliacao) {
this.avaliacao = avaliacao;
}

public String getEditora() {
return editora;
}

public void setEditora(String editora) {
this.editora = editora;
}

Dao
O pacote Dao vai realizar a comunicao com o banco utilizando o hibernate para salvar, listar alterar e excluir
livros. Dentro deste pacote, deve ser criada uma interface chamada LivroDao, uma classe chamada LivroDaoImp
e uma classe chamada HibernateUtil (realizar a conexo com o banco) da mesma forma que estas:
Interface LivroDao
Classe LivroDaoImp
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getIsbn() {
return isbn;
}

public void setIsbn(String isbn) {
this.isbn = isbn;
}

public int getPaginas() {
return paginas;
}

public void setPaginas(int paginas) {
this.paginas = paginas;
}

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Dao;

import Model.Livro;
import java.util.List;

/**
*
* @author Jos Alexandre
*/
public interface LivroDao {

public void save(Livro livro);
public Livro getLivro(long id);
public List<Livro> list();
public void remove(Livro livro);
public void update(Livro livro);

}
1
2
3
4
5
6
7
8
9
10
package Dao;

import Model.Livro;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
*
* @author Jos Alexandre
Classe HibernateUtil
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
*/
public class LivroDaoImp implements LivroDao {

public void save(Livro livro) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.save(livro);
t.commit();
}
public Livro getLivro(long id) {
Session session = HibernateUtil.getSessionFactory().openSession();
return (Livro) session.load(Livro.class, id);
}
public List<Livro> list() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
List lista = session.createQuery("from Livro").list();
t.commit();
return lista;
}
public void remove(Livro livro) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.delete(livro);
t.commit();
}
public void update(Livro livro) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.update(livro);
t.commit();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package Utils;

import Model.Livro;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
* Hibernate Utility class with a convenient method to get Session Factory object.
*
* @author Jos Alexandre
*/
public class HibernateUtil {

private static SessionFactory sessionFactory;

private HibernateUtil() {
}

public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
AnnotationConfiguration ac = new AnnotationConfiguration();
ac.addAnnotatedClass(Livro.class);
sessionFactory = ac.configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed."
throw new ExceptionInInitializerError(ex);
}
return sessionFactory;
} else {
return sessionFactory;
}
}
Controller
O pacote Controller vai realizar a comunicao da Camada de Viso representada por nossas pginas JSF com o
banco de dados sendo responsvel por realizar as operaes requisitadas nas pginas JSF e em seguida
encaminhar o usurio para uma pgina. A classe a ser criada deve chamar LivroController e precisa ser escrita
dessa forma:
View
O pacote View composto por pginas JSF que iro executar o pedido de listagem, alterao, excluso e adio
de Livros, o nosso projeto precisar de duas pginas JSF uma chamada index.xhtml que listar os Livros do
Usurio e permitir exclu-los e acessar as pginas de alterao e insero, a segunda pgina chamada
gerenciarLivro.xhtml ser criada para realizar a adio e alterao dos livros. As duas pginas se comunicam
diretamente com os mtodos e atributos da classe LivroController permitindo a interao de forma fcil com o
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package Controller;

import Dao.LivroDao;
import Dao.LivroDaoImp;
import Model.Livro;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
*
* @author Jos Alexandre
*/
@ManagedBean
@SessionScoped
public class LivroController {

private Livro livro;
private DataModel listaLivros;

public DataModel getListarLivros() {
List<Livro> lista = new LivroDaoImp().list();
listaLivros = new ListDataModel(lista);
return listaLivros;
}
public Livro getLivro() {
return livro;
}
public void setLivro(Livro livro) {
this.livro = livro;
}
public String prepararAdicionarLivro(){
livro = new Livro();
return "gerenciarLivro";
}
public String prepararAlterarLivro(){
livro = (Livro)(listaLivros.getRowData());
return "gerenciarLivro";
}
public String excluirLivro(){
Livro livroTemp = (Livro)(listaLivros.getRowData());
LivroDao dao = new LivroDaoImp();
dao.remove(livroTemp);
return "index";
}
public String adicionarLivro(){
LivroDao dao = new LivroDaoImp();
dao.save(livro);
return "index";
}
public String alterarLivro(){
LivroDao dao = new LivroDaoImp();
dao.update(livro);
return "index";
}
}
banco de dados. Em seguida so apresentadas as pginas necessrias.
Pgina index.xhtml
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Gerenciador de Livros</title>
</h:head>
<h:body>
<h1>Gerenciador de Livros</h1>
<h:dataTable var="livro" value="#{livroController.listarLivros}"
<h:column>
<f:facet name="header">
<h:outputText value="Ttulo"/>
</f:facet>
<h:outputText value="#{livro.titulo}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Autor"/>
</f:facet>
<h:outputText value="#{livro.autor}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Pginas"/>
</f:facet>
<h:outputText value="#{livro.paginas}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Editora"/>
</f:facet>
<h:outputText value="#{livro.editora}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Isbn"/>
</f:facet>
<h:outputText value="#{livro.isbn}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Avaliao"/>
</f:facet>
<h:outputText value="#{livro.avaliacao}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Alterar"/>
</f:facet>
<h:form>
<h:commandButton action="#{livroController.prepararAlterarLivro}"
</h:form>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Excluir"/>
</f:facet>
<h:form>
<h:commandButton action="#{livroController.excluirLivro}"
</h:form>
</h:column>
</h:dataTable>
<br/>
<h:form>
<h:commandLink value="Novo Livro" action="#{livroController.prepararAdicionarLivro}"
</h:form>
</h:body>
</html>
Pgina gerenciarLivro.xhtml
Configuraes necessrias
Arquivo web. xml
Arquivo hibernate. cfg. xml
Este arquivo configura o hibernate de acordo com seu banco de dados note que preciso adicionar ainda o seu
usurio no banco de dados, sua senha e caso seja necessrio o ip e a porta do banco.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Gerenciador de Livros</title>
</h:head>
<h:body>
<h1>Gerenciador de Livros</h1>
<h:form>
Ttulo <h:inputText value="#{livroController.livro.titulo}"
Autor: <h:inputText value="#{livroController.livro.autor}"
Paginas: <h:inputText value="#{livroController.livro.paginas}"
Editora: <h:inputText value="#{livroController.livro.editora}"
ISBN: <h:inputText value="#{livroController.livro.isbn}"
Avaliao: <h:selectOneMenu value="#{livroController.livro.avaliacao}"
<f:selectItem itemLabel="1" itemValue="1"/>
<f:selectItem itemLabel="2" itemValue="2"/>
<f:selectItem itemLabel="3" itemValue="3"/>
<f:selectItem itemLabel="4" itemValue="4"/>
<f:selectItem itemLabel="5" itemValue="5"/>
</h:selectOneMenu><br/>
<h:commandButton action="#{livroController.adicionarLivro}"
<h:commandButton action="#{livroController.alterarLivro}"
<br/>
<h:commandLink action="index" value="Voltar"/>
</h:form>
</h:body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "
<hibernate-configuration>
<session-factory>
Essas so as informaes necessrias para a criao de um CRUD bsico para a gerencia de Livros utilizando JSF
2.0 e Hibernate, neste link segue o projeto criado no Netbeans para download.
5
6
7
8
9
10
11
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/livraria
<property name="hibernate.connection.username">seuUsuario</property
<property name="hibernate.connection.password">suaSenha</property
</session-factory>
</hibernate-configuration>

Você também pode gostar