segunda-feira, 10 de agosto de 2015

Crud Java Web - JSF + Hibernate + Primefaces

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

 

About the Author

Unknown

Author & Editor

Has laoreet percipitur ad. Vide interesset in mei, no his legimus verterem. Et nostrum imperdiet appellantur usu, mnesarchum referrentur id vim.

8 comentários:

  1. Bom dia, como ficou o link para acessa a aplicação?

    Obrigado.

    ResponderExcluir
    Respostas
    1. Olá, o link é este: https://github.com/gabriel1303/Crud-JSF-com-hibernate-primefaces

      Excluir
  2. Cara, 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. ???

    ResponderExcluir
    Respostas
    1. opa, 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/ ?

      Excluir
    2. Conseguiu 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.

      Excluir
  3. Pq não tá mapeando? Tento cadastrar algum aluno e clico em salvar mas não acontece nada, como resolver isso?

    ResponderExcluir
    Respostas
    1. você criou o banco escola (create database escola;) no mysql?

      Excluir
  4. Parabens pela postagem
    Porém não consegui rodar por aqui.
    Tenho uma duvida quanto ao mapeamento e quanto ao pol.xml
    O banco local existe.

    ResponderExcluir

 
Academy Programming © 2015 - Designed by Templateism.com