Botão Filtrar+JSF2+Hibernate+MySQL

Java

02/05/2011

Boa Noite. Novamente estou postando uma dúvida, pois quando não encontro nada no Google o jeito é perguntar para quem sabe. Estou estudando JSF2 e fazendo um CRUD simples. Gostaria de fazer um botão PESQUISAR para Filtrar por TITULO  (É um cadastro simples de Livros). O Botão até já adicionei. Alguém pode me ajudar? Agradeço desde já. Se tiverem sugestões de melhorias ficarei grato. LivroDao.java  
 
package Dao;
import Model.Livro;
import java.util.List;
 
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);
}
 
  LivroDaoImp.java  
 
LivroDaoImp.java 
package Dao;
import Model.Livro;
import Utils.HibernateUtil;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;

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();
    }
}
 
  LivroController.java  
 
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;
@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 "gerenciarLivro";
    }
    public String adicionarLivro(){
        LivroDao dao = new LivroDaoImp();
        dao.save(livro);
        return "gerenciarLivro";
        
    }
    public String alterarLivro(){
        LivroDao dao = new LivroDaoImp();
        dao.update(livro);
        return "gerenciarLivro";
    }
    public String limpar() {
       Livro livroParaUpdate = new Livro();
       if (getLivro() != null) {
         livroParaUpdate.setId(getLivro().getId());
      }
     setLivro(livroParaUpdate);
     return "gerenciarLivro";
   }
   
}
 

  gerenciarLivro.xhtml  
 
<!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.prime.com.tr/ui">
    <h:head>
        <link href="css/theme.css" rel="stylesheet" type="text/css" />
    </h:head>
    <h:body>        
        <h:form id="form">
            <p:panel header="Cadastro de Livros">
                <h:messages errorClass="error"/>
                <h:panelGrid columns="2" id="painel">
                    <h:outputText value="Titulo: *" />
                    <p:inputText required="true" requiredMessage="Campo [Título] Obrigatório" value="#{livroController.livro.titulo}"/>
                    <h:outputText  value="Autor: " />
                    <p:inputText  value="#{livroController.livro.autor}"/>
                    <h:outputText value="Páginas: " />
                    <p:inputText  value="#{livroController.livro.paginas}"/>
                    <h:outputText value="Editora: " />
                    <p:inputText  value="#{livroController.livro.editora}"/>
                    <h:outputText value="ISBN: " />
                    <p:inputText  value="#{livroController.livro.isbn}"/>
                    <h:outputText value="Avaliação: " />
                    <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>
                </h:panelGrid>
                <p:commandButton value="Gravar"  actionListener="#{livroController.adicionarLivro}" ajax="false" />
                <p:commandButton value="Alterar" actionListener="#{livroController.alterarLivro}"   ajax="false" />
                <p:commandButton value="Filtrar" actionListener="#{livroController.listarLivros}"   ajax="false" />
                <p:commandButton value="Limpar"  actionListener="#{livroController.limpar}"         ajax="false" />
            </p:panel>
            <br/>
            <br/>
        </h:form>
        <h:form>
            <p:outputPanel id="livro">
                <p:dataTable value="#{livroController.listarLivros}" var="livro">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Título" />
                        </f:facet>
                        <h:outputText value="#{livro.titulo}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Autor" />
                        </f:facet>
                        <h:outputText value="#{livro.autor}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Operações" />
                        </f:facet>
                        <h:commandButton action="#{livroController.prepararAlterarLivro}" value="Selecionar"/>
                        <h:commandButton action="#{livroController.excluirLivro}"         value="Excluir"/>
                    </p:column>
                </p:dataTable>
            </p:outputPanel>
        </h:form>
    </h:body>
</html>
 
     
Renato Vieira

Renato Vieira

Curtidas 0

Respostas

Robson Teixeira

Robson Teixeira

02/05/2011

Olá Renato
  pelo que vi acho que tenho ideia do que tem errado o seu botão filtrar ele tem que atualizar a tabela abaixo do form???
  se for sugiro o uso de AJAX e o primefaces que está usando tem suporte e remova o atributo actionListener do botão filtrar e use com ajax assim.
<p:commandButton value="Filtrar" process="@this"  update="livro "/>

com relação a remoção do actionlistener e que ele é normalmente pelo que sei usando em métodos set e não em get.
 e sempre vale a pena da uma olhada no showcase do primefaces para tirar duvidas sobre os componentes disponiveis.

qualquer coisa é so chamar.
att
 robson Passarella
GOSTEI 0
Davi Costa

Davi Costa

02/05/2011

Só complementando o que o Robson falou, na sua camada de negócio não vi nenhum método que filtre por título ou autor... vc vai ter que implementá-lo e chamar esse método através do seu bean passando os parâmetros que vc quer filtrar.



Att Davi
GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Obrigado a Todos pelo Retorno.   Davi Gomes da Costa  é justamente esta parte que estou precisando de ajuda! Como criar os métodos com Filtro.   Abraços
GOSTEI 0
Davi Costa

Davi Costa

02/05/2011

Pesquise sobre Criteria (Hibernate),
qualquer dúvida mais pontual é só avisar.

Att Davi
GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Olá Obrigado pelas Dicas. Encontrei no PRIMEFACES uma função que ajudou muito no caso de Filtro. Porém estou com um problema com o DataModel + PrimeFaces.   Quando Digito alguma informação no Titulo o Filtro é realizado com Sucesso. PORÉM:   Filtrou Certo  
 
 <p:column filterBy="#{livro.titulo}" headerText="Título">
        <f:facet name="header">
           <h:outputText value="Título" />
        </f:facet>
        <h:outputText value="#{livro.titulo}" />
   </p:column>
 

  Quando Clico em Selecionar para Preencher os Campos dá a Seguinte Mensagem de ERRO:   javax.faces.model.NoRowAvailableException     É como se perdesse o ponteiro da linha.   Pois se nao Filtrar e Clicar em SELECIONAR OU EXCLUIR Funcionar normalmente.   Alguém tem uma LUZ?   Estou pesquisando em Fóruns e no Google.   Obrigado   Renato      
GOSTEI 0
Robson Teixeira

Robson Teixeira

02/05/2011

quando vc clica em selecionar vc pretende fazer o que necessariamente??
e o datatable do primefaces tem o selection para selecionar o objeto

<p:dataTable var="car" value="#{tableBean.carsSmall}"                   selection="#{tableBean.selectedCar}" selectionMode="single">
e na managedBean vc cria 1 atributo como no exemplo do Tipo car

private Car selectedCar; 

com os respectivos getters e setters

segue link no showcase do primefaces.

http://www.primefaces.org/showcase/ui/datatableRowSelectionSingle.jsf

qualquer coisa e so chamar.
att
 robson passarella
GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Olá Robson. Obrigado pelo Retorno.   O Objetivo do selecionar é preencher o formulário acima após realizar um Filtro do PrimeFaces.   Se utilizar o link Sugerido:   http://www.primefaces.org/showcase/ui/datatableRowSelectionSingle.jsf   Fica Assim:   [CODE]   <p:dataTable value="#{livroController.listarLivros}"
                             var="livro" emptyMessage="Nenhum Registro Encontrado..."
                             selection="#{livroController.livro}" selectionMode="single"> [/CODE/
Qundo clica não preenche o Formulário. Provavelmente falta mais alguma ação.     No Aguado.   Obrigado
GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Fiz outro TESTE.   dataTable  
 
<p:dataTable value="#{livroController.listarLivros}" 
   var="livro" emptyMessage="Nenhum Registro Encontrado..."
   selection="#{livroController.livro}" selectionMode="sngle">
 
  Botão Selecionar  
 
<p:commandButton action="#{livroController.prepararAlterarLivro}" value="Selecionar" update="form"/>
 

  O Problema está em minha Classe LivroController pois quando seleciono um item sem Filtrar Funciona Corretamente, porém, se eu Filtrar por Titulo ou Autor e depois clicar em Selecionar simplesmente não faz nada. É como se perdesse o ponteiro.   LivroController.java  
 
 public String prepararAlterarLivro(){
        livro = (Livro)(listaLivros.getRowData());
        return "gerenciarLivro";
    }
 

   
GOSTEI 0
Robson Teixeira

Robson Teixeira

02/05/2011

teria como enviar uma copia do seu projeto eu poder analisar??? se sim envie para rpateixeira@gmail.com que vou está retornando assim que possivel

att
 robson passarella
GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Bom dia Robson. Claro, sem problemas. Vou enviar para seu e-mail. O Objetivo é um cadastro simples de livro à nível de aprendizado. Estou iniciando com JSF2, por este motivo à dificuldades. Atualmente em meus projetos utilizo javabeans+JSP+Javascript. Resumindo, codigo Javas dentro das paginas e nao existe MVC. Queria aos poucos converter.   Abraços e Obrigado   Renato
GOSTEI 0
Robson Teixeira

Robson Teixeira

02/05/2011

Iae renato blz
 desculpe a demora mas ja ta ai o retorno
  na sua classe LivroController no método prepararAlterarLivro veja a unica coisa que fiz abaixo
public String prepararAlterarLivro(){
     //   livro = (Livro)(listaLivros.getRowData());
        return "gerenciarLivro";
    }

acredito que seja isso pois os campos foram totalmente preenchidos.

teste tambem ok??
att
 robson
GOSTEI 0
Dyego Carmo

Dyego Carmo

02/05/2011

Resolvido ? Favor fechar :)
GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Olá Robson. Obrigado pelo Retorno. Fiz a alteração conforme solicitado porém o problema continua, sempre apos um Filtro quando clico em selecionar os campos do Form nao sao preenchidos..  
 
 public String prepararAlterarLivro(){
    //    livro = (Livro)(listaLivros.getRowData());
        return "gerenciarLivro";
    }
 
 
GOSTEI 0
Robson Teixeira

Robson Teixeira

02/05/2011

tenta limpar o cache do browser pois eu fiz com o firefox e não com o IE pode-ser isso e você clicou na linha da tabela antes de clicar no bt selecionar??? pois o primefaces pega a linha de seu datatable e seta no atributo livro quando vc clica no botão selecionar mas a linha tem q está ja selecionada.
GOSTEI 0
Renato Vieira

Renato Vieira

02/05/2011

Boa Noite Robson. Obrigado pelo retorno. Limpei o Cache e fiz conforme solicitado, e funcinou. Como você citou, é preciso após FILTRAR clicar na linha e depois selecionar.   Muito Obrigado pela Ajuda.   Vou continuar meus Estudos.   Abraços   Renato   FECHAR CHAMADO  
GOSTEI 0
Robson Teixeira

Robson Teixeira

02/05/2011

De nada
estamos aqui para isso.

GOSTEI 0
Davi Costa

Davi Costa

02/05/2011

Show de bola Renato.

Vc que fecha o chamado, senão me engano fica uma opção em cima ou no fim do seu post, para finalizar o chamado.

Att Davi
GOSTEI 0
Dyego Carmo

Dyego Carmo

02/05/2011

Eu não entendi uma coisa,


Qual o comportamento que está tento e qual o comportamento voce espera ?

Está bem enrrolado ehhehe...

GOSTEI 0
Suarez William

Suarez William

02/05/2011

Boa Noite Robson. Obrigado pelo retorno.
Limpei o Cache e fiz conforme solicitado, e funcinou.
Como você citou, é preciso após FILTRAR clicar na linha e depois selecionar.
 
Muito Obrigado pela Ajuda.
 
Vou continuar meus Estudos.
 
Abraços
 
Renato
 
FECHAR CHAMADO
 



Saludos como limpiaste la cache podrias explicar gracias
GOSTEI 0
POSTAR