Botão Filtrar+JSF2+Hibernate+MySQL
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
LivroDaoImp.java
LivroController.java
gerenciarLivro.xhtml
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
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();
}
}
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";
}
}
<!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
Curtidas 0
Respostas
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
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
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
Att Davi
GOSTEI 0
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
02/05/2011
Pesquise sobre Criteria (Hibernate),
qualquer dúvida mais pontual é só avisar.
Att Davi
qualquer dúvida mais pontual é só avisar.
Att Davi
GOSTEI 0
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
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
<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>
GOSTEI 0
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
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
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
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
02/05/2011
Fiz outro TESTE.
dataTable
Botão Selecionar
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
<p:dataTable value="#{livroController.listarLivros}"
var="livro" emptyMessage="Nenhum Registro Encontrado..."
selection="#{livroController.livro}" selectionMode="sngle">
<p:commandButton action="#{livroController.prepararAlterarLivro}" value="Selecionar" update="form"/>
public String prepararAlterarLivro(){
livro = (Livro)(listaLivros.getRowData());
return "gerenciarLivro";
}
GOSTEI 0
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
att
robson passarella
GOSTEI 0
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
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
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
02/05/2011
Resolvido ? Favor fechar :)
GOSTEI 0
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
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
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
02/05/2011
De nada
estamos aqui para isso.
estamos aqui para isso.
GOSTEI 0
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
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
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...
Qual o comportamento que está tento e qual o comportamento voce espera ?
Está bem enrrolado ehhehe...
GOSTEI 0
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
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