31 de outubro de 2010

JavaEE 5: CRUD em páginas com PrimeFaces 1.1

Esta postagem não difere muito desta: CRUD em JSF, o que difere é que teremos um pouco mais que um HTML puro como visualização, estaremos utilizando o PrimeFaces para criar a tabela com paginação e ter o inserir, alterar e remover dentro de painéis. Então, inicialmente a diferença do link acima é que nesta postagem estaremos utilizando valores como: double e java.util.Date, para mostrar que quando se trata de JSF não há necessidade de converter esses valores (no caso de view para controle) apenas na hora de armazenar no banco de dados é necessário converter o java.util.Date para java.sql.Date e vice-versa.

Iniciando...
Como estamos adicionando um valor(double) e uma data(java.util.Date) na nossa aplicação, segue o código SQL atualizado:
CREATE TABLE Categoria (
  `codigo` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(45) DEFAULT NULL,
  `valor` double DEFAULT NULL,
  `data` date DEFAULT NULL,
  PRIMARY KEY (`codigo`)
)
Eu criei essa tabela dentro de uma database "tads", caso não seja essa a sua, lembre-se de informar isso ao criar a conexão ;)

Estrutura geral da aplicação:

Crie um JSF Project com o nome de Prime, seguindo a estrutura crie os pacotes: control, dao e model (lembre-se de adicionar o connector do MySQL a aplicação, ensinado nas postagens anteriores). Segue os códigos das classes que foram atualizados: Categoria.java, Categoria_DAO.java :
model
Categoria.java:
public class Categoria {

    private int codigo;
    private String nome;
    private double valor;
    private Date data;
    
    public int getCodigo() {
        return codigo;
    }
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public double getValor() {
        return valor;
    }
    public void setValor(double valor) {
        this.valor = valor;
    }
    public Date getData() {
        return data;
    }
    public void setData(Date data) {
        this.data = data;
    }
    
}

dao
Categoria_DAO.java:
public class Categoria_DAO {
    
    public String inserir(Categoria categoria){
        String retorno = "falha";
        Conexao conn = new Conexao();
        try{
            Date dataSql = new Date(categoria.getData().getTime());
            
            Statement stmt = (Statement) conn.getConn().createStatement();
            stmt.execute("insert into Categoria (nome, valor, data) values ('"+categoria.getNome()+"','"+categoria.getValor()+"','"+dataSql+"')");
            retorno =  "sucesso";
        }catch(Exception e){  
            e.printStackTrace();
        }finally {
            conn.fecharConexao();
        }
        
        return retorno;
    }
    
    public List<Categoria> listar(){
        List<Categoria> categorias = new ArrayList<Categoria>();
        Conexao conn = new Conexao();
        try{
            
            Statement stmt = (Statement) conn.getConn().createStatement();
            ResultSet rs = stmt.executeQuery("Select * from Categoria");
            while(rs.next()){
                Categoria categoria = new Categoria();
                categoria.setCodigo(rs.getInt("codigo"));
                categoria.setNome(rs.getString("nome"));
                categoria.setValor(rs.getDouble("valor"));
                categoria.setData(new SimpleDateFormat("yyyy-MM-dd").parse(rs.getString("data")));
                categorias.add(categoria);
            }
        }catch(Exception e){  
            e.printStackTrace();
        }finally {
            conn.fecharConexao();
        }
        
        return categorias;
    }
    
    public Categoria selecionar(int codigo){
        Categoria categoria = new Categoria();
        Conexao conn = new Conexao();
        try{
            Statement stmt = (Statement) conn.getConn().createStatement();
            ResultSet rs = stmt.executeQuery("Select * from Categoria where codigo = '"+codigo+"'");
            rs.next();
                categoria.setCodigo(rs.getInt("codigo"));
                categoria.setNome(rs.getString("nome"));
                categoria.setValor(rs.getDouble("valor"));
                categoria.setData(new SimpleDateFormat("yyyy-MM-dd").parse(rs.getString("data")));
        }catch(Exception e){  
            e.printStackTrace();
        }finally {
            conn.fecharConexao();
        }
        
        return categoria;
    }
    
    public String alterar(Categoria categoria){
        String retorno = "falha";
        Conexao conn = new Conexao();
        try{
            Date dataSql = new Date(categoria.getData().getTime());
            
            Statement stmt = (Statement) conn.getConn().createStatement();
            stmt.execute("update Categoria set nome = '"+categoria.getNome()+"', " +
                    "valor = '"+categoria.getValor()+"', data = '"+dataSql+"' " +
                            " where codigo = '"+categoria.getCodigo()+"'");
            retorno =  "sucesso";
        }catch(Exception e){  
            e.printStackTrace();
        }finally {
            conn.fecharConexao();
        }
        
        return retorno;
    }
    
    public String remover(int codigo){
        String retorno = "falha";
        Conexao conn = new Conexao();
        try{
            Statement stmt = (Statement) conn.getConn().createStatement();
            stmt.execute("delete from Categoria where codigo = '"+codigo+"'");
            retorno =  "sucesso";
        }catch(Exception e){  
            e.printStackTrace();
        }finally {
            conn.fecharConexao();
        }
        
        return retorno;
    }
}

Quanto as outras classes (CategoriaBean) continuam do mesmo jeito que no CRUD em JSF.
Agora o que muda também são nossos JSP's, para configurar o PrimeFaces 1.1: Clique aqui
Depois de configurado podemos começar a implementação dos nossos JSP's:
index.jsp:



Código-Fonte:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://primefaces.prime.com.tr/ui" prefix="p"%>

<html>
<f:view>
    <head>
    <title>Categorias</title>
    <p:resources />
    </head>
    <body>
    <h:form>
        <p:commandButton value="Nova" action="#{categoriaBean.nova}"
            ajax="false" />

        <p:dataTable value="#{categoriaBean.categorias}" var="c"
            paginator="true" rows="5" emptyMessage="Categorias não encontradas!">
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Codigo" />
                </f:facet>
                <h:outputText value="#{c.codigo}" />
            </p:column>
            <p:column filterBy="#{c.nome}">
                <f:facet name="header">
                    <h:outputText value="Nome" />
                </f:facet>
                <h:outputText value="#{c.nome}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Valor" />
                </f:facet>
                <h:outputText value="#{c.valor}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Data" />
                </f:facet>
                <h:outputText value="#{c.data}">
                    <f:convertDateTime pattern="dd/MM/yyyy" />
                </h:outputText>
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Ações" />
                </f:facet>
                <h:commandButton value="Editar"
                    actionListener="#{categoriaBean.selecionar(c.codigo)}"
                    action="alterar" image="/imagens/editar.png" />
                <h:commandButton value="Remover"
                    actionListener="#{categoriaBean.selecionar(c.codigo)}"
                    action="remover" image="/imagens/remover.png" />
            </p:column>
        </p:dataTable>
    </h:form>
    </body>
</f:view>
</html>

inserirCategoria.jsp:

Código-Fonte:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://primefaces.prime.com.tr/ui" prefix="p" %>
<html>
<f:view>
    <head>
        <title>Inserir Categoria</title>
        <p:resources />
    </head>
    <body>
        <p:growl id="aviso" />
    
        <p:panel header="Inserir Categoria" style="width: 320px" >
            <h:form>
                <h:panelGrid columns="2">
                    <h:outputText value="Nome" />
                    <h:inputText value="#{categoriaBean.categoria.nome}" required="true" requiredMessage="Informe o nome" />
                    <h:outputText value="Valor" />
                    <h:inputText value="#{categoriaBean.categoria.valor}" required="true" requiredMessage="Informe o valor" />
                    <h:outputText value="Data" />
                    <p:calendar value="#{categoriaBean.categoria.data}" pattern="dd/MM/yyyy" locale="pt_BR" required="true" requiredMessage="Informe a data" />
                    <p:commandButton value="Salvar" action="#{categoriaBean.inserir}" update="aviso" ajax="false" />
                    <p:commandButton value="Cancelar" action="cancelar" immediate="true" ajax="false" />
                </h:panelGrid>
            </h:form>
        </p:panel>
    </body>
</f:view>    
</html>  

alterarCategoria.jsp
O alterarCategoria é praticamente idêntico ao inserirCategoria, o que muda é o botão de Salvar pois a action passa a ser #{categoriaBean.alterar}, mas mesmo assim segue o código:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://primefaces.prime.com.tr/ui" prefix="p" %>
<html>
<f:view>
    <head>
        <title>Alterar Categoria</title>
        <p:resources />
    </head>
    <body>
        <p:growl id="aviso" />
    
        <p:panel header="Alterar Categoria" style="width: 320px" >
            <h:form>
                <h:panelGrid columns="2">
                    <h:outputText value="Nome" />
                    <h:inputText value="#{categoriaBean.categoria.nome}" required="true" requiredMessage="Informe o nome" />
                    <h:outputText value="Valor" />
                    <h:inputText value="#{categoriaBean.categoria.valor}" required="true" requiredMessage="Informe o valor" />
                    <h:outputText value="Data" />
                    <p:calendar value="#{categoriaBean.categoria.data}" pattern="dd/MM/yyyy" locale="pt_BR" required="true" requiredMessage="Informe a data" />
                    <p:commandButton value="Salvar" action="#{categoriaBean.alterar}" update="aviso" ajax="false" />
                    <p:commandButton value="Cancelar" action="cancelar" immediate="true" ajax="false" />
                </h:panelGrid>
            </h:form>
        </p:panel>
    </body>
</f:view>    
</html>  

removerCategoria.jsp

Código-Fonte:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://primefaces.prime.com.tr/ui" prefix="p" %>
<html>
<f:view>
    <head>
        <title>Remover Categoria</title>
        <p:resources />
    </head>
    <body>
            <p:panel header="Remover Categoria" style="width: 400px" >
            <h:form>
                <h:outputText value="Confirma remoção da categoria: #{categoriaBean.categoria.nome} ?" />
                <h:panelGrid columns="2">
                    <p:commandButton value="Sim" action="#{categoriaBean.remover}" ajax="false" />
                    <p:commandButton value="Não" action="cancelar" immediate="true" ajax="false" />
                </h:panelGrid>
            </h:form>
        </p:panel>
    </body>
</f:view>    
</html>  

Para finalizar, o faces-config.xml deve ter essa estrutura de navegação:

6 comentários:

  1. Excelente artigo Andréia, é o primeiro artigo que realmente você ler e aplica o que foi exposto, que realmente funciona. Parabéns continue assim.

    ResponderExcluir
  2. Olá! Obrigada pela visita e pelo comentário... Volte sempre! Fico muito feliz em poder ajudar =D

    ResponderExcluir
  3. Muito bom...
    Podeira colocar os arquivos pra download?

    Obrigado

    ResponderExcluir
  4. poderia postar o codigo do manager bean

    ResponderExcluir
  5. O link informado acima está corrompido Andii..

    ResponderExcluir
  6. Olá Felipe! Obrigada por avisar, mas andei vendo, e o link é o mesmo ao qual eu me referencio no começo da postagem "CRUD em JSF" :)

    ResponderExcluir

Deixe seu comentário... ;)