Este artigo tem por objetivo apresentar um sistema de cadastro utilizando a linguagem de programação Java, e seus respectivos frameworks JSF, Primefaces, integração com banco de dados usando Hibernate, persistência com arquivo xml, e padrão de projeto MVC(Model, View, Control).
Neste projeto foram utilizados as ferramentas: Eclipse Luna, MYSQL.
Para baixar o projeto completo clique aqui
Crie um banco de dados chamado escola. não crie nenhuma tabela, pois o hibernate fará isso para você!
Para começar crie um new Dinamic Web Project. Name: Escola
na página seguinte, clique na opção gerar arquivo web.xml
Com o projeto criado, é hora de converter o projeto para Maven.
Com o botão direito do mouse clique sobre o projeto - configure - convert to maven Project
Por quê utilizar o maven: O maven é um facilitador de dependências, ao invés de importarmos vários arquivos .jar ao projeto, iremos inserir blocos de xml em um arquivo chamado pom.xml. Ele vai importar direto dos repositórios todas as nossas dependências e manter atualizado nosso projeto.
Vamos começar a programar:
Crie o pacote com.pap.util
Nele inserir a classe: HibernateUtil.java
package com.pap.util;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
* Gabriel Massuquetti de Carvalho
*/
public class HibernateUtil {
private static EntityManagerFactory emf;
private HibernateUtil() {
}
public static EntityManagerFactory geteEntityManagerFactory() {
if (emf == null) {
try {
emf = Persistence
.createEntityManagerFactory("exemplohibernate");
} catch (Exception ex) {
System.err.println("Initial SessionFactory creation failed."
+ ex);
}
}
return emf;
}
}
No pom.xml insira:
<repositories>
<repository>
<id>jboss-public-repository-group</id>
<name>JBoss Public Maven Repository Group</name>
<url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>net.bootsfaces</groupId>
<artifactId>bootsfaces</artifactId>
<version>0.6.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.2.RC1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.0.1.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
</dependencies>
Crie o pacote com.pap.entity
Nele inserir a classe: Aluno.java
package com.pap.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name="aluno")
@Entity
public class Aluno implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String curso;
private String periodo;
public Aluno() {
super();
// TODO Auto-generated constructor stub
}
public Aluno(Long id, String name, String curso, String periodo) {
super();
this.id = id;
this.name = name;
this.curso = curso;
this.periodo = periodo;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCurso() {
return curso;
}
public void setCurso(String curso) {
this.curso = curso;
}
public String getPeriodo() {
return periodo;
}
public void setPeriodo(String periodo) {
this.periodo = periodo;
}
}
Crie o pacote com.pap.dao
Nele inserir a classe: AlunoDao.java
package com.pap.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import com.pap.entity.Aluno;
public class AlunoDao {
public void saveOrUpdate(Aluno aluno) {
EntityManager em = com.pap.util.HibernateUtil
.geteEntityManagerFactory().createEntityManager();
try {
em.getTransaction().begin();
if (aluno.getId() == null)
em.persist(aluno);
else
em.merge(aluno);
em.getTransaction().commit();
} catch (Exception e) {
em.getTransaction().rollback();
}
}
public void delete(Aluno aluno) {
EntityManager em = com.pap.util.HibernateUtil
.geteEntityManagerFactory().createEntityManager();
try {
em.getTransaction().begin();
Aluno al = em.find(Aluno.class, aluno.getId());
em.remove(al);
em.getTransaction().commit();
} catch (Exception e) {
em.getTransaction().rollback();
}
}
public List<Aluno> list() {
List<Aluno> result = null;
try {
EntityManager em = com.pap.util.HibernateUtil
.geteEntityManagerFactory().createEntityManager();
Query query = em.createQuery("FROM Aluno");
result = query.getResultList();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
Crie o pacote com.pap.control
Nele inserir a classe: AlunoMBean.java
package com.pap.control;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import com.pap.dao.AlunoDao;
import com.pap.entity.Aluno;
@ManagedBean
@SessionScoped
public class AlunoMBean {
private static final long serialVersionUID = 1L;
private Aluno aluno;
private AlunoDao ad;
private List<Aluno> AlunoList;
@PostConstruct
public void init(){
this.aluno = new Aluno();
this.ad = new AlunoDao();
this.AlunoList = ad.list();
}
public String newAluno(){
return "manageAluno";
}
public String delete(Aluno aluno){
ad.delete(aluno);
return "aluno";
}
public String edit(Aluno aluno){
this.aluno = aluno;
return "manageAluno";
}
public String save() {
ad.saveOrUpdate(aluno);
this.aluno = new Aluno();
return "aluno";
}
//Geters and seters
public Aluno getAluno() {
return aluno;
}
public void setAluno(Aluno aluno) {
this.aluno = aluno;
}
public AlunoDao getAd() {
return ad;
}
public void setAd(AlunoDao ad) {
this.ad = ad;
}
public List<Aluno> getAlunoList() {
this.AlunoList = ad.list();
return AlunoList;
}
public void setAlunoList(List<Aluno> alunoList) {
AlunoList = alunoList;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
Dentro de SRC crie uma nova pasta chamada META-INF. Nela crie um arquivo chamado persistence.xml
Dentro de persistence.xml adicione:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="exemplohibernate">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.pap.entity.Aluno</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/escola" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="root" />
</properties>
</persistence-unit>
</persistence>
Está na hora de criar nossas views: Na pasta WebContent do seu projeto crie um novo arquivo aluno.xhtml. Ele será responsável por exibir nossos alunos cadastrados.
aluno.xhtml:
<?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"
xmlns:p="http://primefaces.org/ui" xmlns:b="http://bootsfaces.net/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Gerencia Aluno</title>
<style>
#bordas {
background-color: #F8F8FC;
}
#rodape {
background-color: #167A89;
color: #F7FBFC;
}
</style>
</h:head>
<h:body>
<div id="bordas">
<b:navBar inverse="true" fixed="top">
<b:navbarLinks>
<b:navLink value="Lista de Alunos" href="aluno.xhtml"></b:navLink>
<b:navLink value="Gerenciar Aluno" href="manageAluno.xhtml"></b:navLink>
</b:navbarLinks>
</b:navBar>
<br /> <br /> <br /><hr/>
<b:container>
<h2>
<h:outputText value="Gerenciar Aluno" />
</h2>
<h:form>
<p:commandButton value="Novo Aluno" id="new"
action="#{alunoMBean.newAluno}" />
</h:form>
<br />
<br />
<h:form>
<p:dataTable id="tbl" var="aluno" value="#{alunoMBean.alunoList}"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}
{Exporters}"
paginator="true" rows="5" style="margin-bottom:20px">
<f:facet name="{Exporters}">
<h:commandLink>
<p:graphicImage value="images/excel.png" width="24" />
<p:dataExporter type="xls" target="tbl" fileName="aluno" />
</h:commandLink>
<h:commandLink>
<p:graphicImage value="images/pdf.png" width="24" />
<p:dataExporter type="pdf" target="tbl" fileName="aluno" />
</h:commandLink>
<h:commandLink>
<p:graphicImage value="images/xml.png" width="24" />
<p:dataExporter type="xml" target="tbl" fileName="aluno" />
</h:commandLink>
</f:facet>
<p:column headerText="Codigo do aluno">
<h:outputText value="#{aluno.id}" />
</p:column>
<p:column headerText="Name Student">
<h:outputText value="#{aluno.name}" />
</p:column>
<p:column headerText="Curso do aluno">
<h:outputText value="#{aluno.curso}" />
</p:column>
<p:column headerText="Turno de estudo">
<h:outputText value="#{aluno.periodo}" />
</p:column>
<p:column headerText="Editar" exportable="false">
<p:commandButton action="#{alunoMBean.edit(aluno)}" value="Editar" />
</p:column>
<p:column headerText="Deletar" exportable="false">
<h:commandLink action="#{alunoMBean.delete(aluno)}"
value="Excluir" />
</p:column>
</p:dataTable>
</h:form>
<br />
<br />
<br />
<br />
</b:container>
</div>
<div id="rodape">
<br />
<br />
<br />
<br />
<center>
<h2>
<h:outputText value="Todos os direitos reservados" />
</h2>
<img src="images/escola.jpg" alt="Escola" width="275" />
</center>
<br />
<br />
<br />
</div>
</h:body>
</html>
Agora a view manageAluno.xhtml. Esta página será responsável por editar ou incluir um novo aluno:
<?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"
xmlns:p="http://primefaces.org/ui" xmlns:b="http://bootsfaces.net/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Gerencia Aluno</title>
<style>
#rodape {
background-color: #167A89;
color: #F7FBFC;
}
#bordas {
background-color: #F8F8FC;
}
</style>
</h:head>
<h:body>
<div id="bordas">
<b:container>
<b:navBar inverse="true" fixed="top">
<b:navbarLinks>
<b:navLink value="Lista de Alunos" href="aluno.xhtml"></b:navLink>
<b:navLink value="Gerenciar Aluno" href="manageAluno.xhtml"></b:navLink>
</b:navbarLinks>
</b:navBar>
<br />
<hr />
<br />
<br />
<br />
<h1>
<h:outputText value="Gerenciar aluno" />
</h1>
<br />
<br />
<h:form>
<p:panel id="panel" header="Adicionar aluno">
<h:panelGrid columns="3" cellpadding="5">
<p:outputLabel value="Name" />
<p:inputText id="name" value="#{alunoMBean.aluno.name}"
label="name">
</p:inputText>
<br />
<p:outputLabel value="Curso" />
<p:inputText id="curso" value="#{alunoMBean.aluno.curso}"
label="curso">
</p:inputText>
<br />
<p:outputLabel value="periodo" />
<p:inputText id="periodo" value="#{alunoMBean.aluno.periodo}"
label="periodo">
</p:inputText>
<br />
</h:panelGrid>
<p:commandButton value="Salvar" update="panel"
action="#{alunoMBean.save}" />
</p:panel>
</h:form>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</b:container>
</div>
<div id="rodape">
<br /> <br /> <br /> <br />
<center>
<h2>
<h:outputText value="Todos os direitos reservados" />
</h2>
<img src="images/escola.jpg" alt="Escola" width="275" />
</center>
<br /> <br /> <br />
</div>
</h:body>
</html>
Neste projeto estamos utilizando datatable do primefaces e ela é capaz de exportas seus dados para os formatos PDF, XLS, XML.
Utilizamos algumas imagens no projeto. Elas foram guardadas dentro da pasta images em WebContent. São elas: Images
Imagens do Projeto final:
Lista de alunos
Cadastrar novo
Informações adicionais: Para criar o menu superior, e manter o conteúdo centralizado foi utilizado o framework bootsfaces: http://www.bootsfaces.net/
Para baixar o projeto completo clique aqui
Assinar:
Postar comentários (Atom)
Bom dia, como ficou o link para acessa a aplicação?
ResponderExcluirObrigado.
Olá, o link é este: https://github.com/gabriel1303/Crud-JSF-com-hibernate-primefaces
ExcluirCara, muito massa, mas não sei porque não deu certo, as paginas não estão mostrando os campos jsf, aluno, curso periodo, nem nada, so o visual mesmo de cores. ???
ResponderExcluiropa, eu boto pra rodar no server, mas quando gera la no eclipse a url, ela nao vem com ../faces/... que deve ter ne... ai quando coloquei, deu certo, mas porque o eclipse nao ta colocando o caminho padrao do jsf /faces/ ?
ExcluirConseguiu cadastrar algum dado? Aqui nem sequer mapeou... A página principal só aparece completando na digitação da URL, pois fica localhost/escola, enfim, se vc encontrou alguma solução avisa aí, valeu.
ExcluirPq não tá mapeando? Tento cadastrar algum aluno e clico em salvar mas não acontece nada, como resolver isso?
ResponderExcluirvocê criou o banco escola (create database escola;) no mysql?
ExcluirParabens pela postagem
ResponderExcluirPorém não consegui rodar por aqui.
Tenho uma duvida quanto ao mapeamento e quanto ao pol.xml
O banco local existe.