[RESOLVIDO] Pesquisar com JSF e Hibernate

16 respostas
A

Boa noite!

Estou desenvolvendo um CRUD de usuários em JSF e usando Hibernate e estou com algumas dificuldades. Eu não sei como fazer uma pesquisa, aonde tenha uma caixa de texto e um botão que carregue o resultado buscando pelo nome do usuário.

Pergunto: Eu posso usar parâmetros nos métodos que vou chamar nas páginas jsf? Os que eu tentei usar não deram certo…

Eu tentei fazer qualquer coisa só pra ver cm se comportava (eu tinha que iniciar de alguma forma :wink: ) e ficou assim:

public List buscarClientePorNome() {
        Query query = manager.createQuery("select u from Usuario u where nome =" + user.getNome()); //cm fzr ele pegar o nome escrito na caixa de texto??
        lista = (List<Usuario>) query.getResultList();
        if (lista.isEmpty()) {
            return null;
        }
        return lista;
    }
<h:form>

                            <table width="500" align="center">
                                <tr>
                                    <td colspan="2" align="right"><h:outputText value="Informe o nome do usuário a ser pesquisado" /></td>
                                </tr>
                                <tr>
                                    <td align="right"><h:inputText  id="nome" /></td>
                                    <td align="left"><h:commandButton value="Pesquisar" action="#{usuarioBeans.buscarClientePorNome}">
                                            <f:setPropertyActionListener value="#{usuarioBeans.user.nome}" target="#{usuarioBeans.user}"/>
                                        </h:commandButton>
                                    </td>
                                </tr>
                            </table>

                        </h:form>

16 Respostas

R

Eu mexi com JSF a muito tempo atrás, não lembro bem, mas acho que você seta seu bean no campo que deseja pegar o parâmetro:

&lt;td align="right"&gt;&lt;h:inputText  value="#{usuarioBean.user.nome}" /&gt;&lt;/td&gt;
// e no método
public List buscarClientePorNome(String nome) {  
    Query query = manager.createQuery("select u from Usuario u where nome like :nome"); //cm fzr ele pegar o nome escrito na caixa de texto??  
    query.setParameter("nome", nome);
    lista = (List&lt;Usuario&gt;) query.getResultList();  
    if (lista.isEmpty()) {  
        return null;  
    }  
    return lista;  
}
A

retorna este erro:

/buscar.xhtml @36,114 value="#{usuarioBean.user.nome}": Target Unreachable, identifier ‘usuarioBean’ resolved to null

Na página jsf eu não passo mesmo parâmetro quando chamo o método, apesar dele existir??

<td align="left"><h:commandButton value="Pesquisar" action="#{usuarioBeans.buscarClientePorNome}">
R

Pode postar seu faces-config.xml?

R

Talvez seja assim:&lt;td align="right"&gt;&lt;h:inputText id="nome" value="#{usuarioBean.nome}" /&gt;&lt;/td&gt;

A

toda vez que vc carregar essa pagina, vc tem que dar um new na variavel user.
sua pagina xhtml vai ficar assim

<h:inputText  value="#{usuarioBean.user.nome}" />

<h:commandButton value="Pesquisar" action="#{usuarioBeans.buscarClientePorNome}">

Dicas: use o conceito de tabless em inves de fazer pagina com table e acostume colocar id em todos os componentes.

t+

E

Você precisa criar o ManagedBean. Por exemplo:

public class UsuarioMB {

    Usuario user = new Usuario();
}

Supondo que sua classe Usuario tenha o atributo nome você faria assim:

<h:inputText  value="#{usuarioMB.user.nome}" />
A

Eu não estou conseguindo…eu tenho que criar uma outra classe, é isso? e o que vai ter nela?? qual a diferença da minha UsuarioBean? eu tenho um objeto de Usuarios nela já.
Qual a diferença de

<h:inputText  value="#{usuarioMB.user.nome}" />

e de

<h:inputText  value="#{usuarioBean.user.nome}" />

??

Obrigada

E

Não precisa criar outra então. Poste o código da usuarioBean.

R

ArianeRebellato:
Eu não estou conseguindo…eu tenho que criar uma outra classe, é isso? e o que vai ter nela?? qual a diferença da minha UsuarioBean? eu tenho um objeto de Usuarios nela já.
Qual a diferença de

<h:inputText  value="#{usuarioMB.user.nome}" />

e de

<h:inputText  value="#{usuarioBean.user.nome}" />

??

Obrigada

Nenhuma, apenas o nome da classe. Acho que o colega só quis exemplificar de outra forma como você precisa fazer.

A

Este método para Buscar está correto?

public List buscarClientePorNome(String nome) { Query query = manager.createQuery("select u from Usuario u where nome like :nome"); query.setParameter("nome", nome); lista = (List<Usuario>) query.getResultList(); if (lista.isEmpty()) { return null; } return lista; }

O erro que retorna ao clicar no pesquisar é: /buscar.xhtml @36,114 value="#{usuarioBean.user.nome}": Target Unreachable, identifier ‘usuarioBean’ resolved to null

:cry:
Desculpa, eu nem tinha visto as respostas…O meu método de listar está funcionando…eu consigo inserir e excluir tbm do banco…travei na busca mesmo pelo nome…eu vejo que ta faltando alguma coisa e não consigo saber exatamente o que…

R

Você precisa postar sua classe UsuarioBean e seu arquivo de configuração do JSF (faces-config.xml), dai fica mais fácil ajudar.

A

O meu projeto não tem este arquivo…isso é possível?? rsrs

A
package Bean;

import java.util.List;
import java.util.TimeZone;
import javax.faces.bean.ManagedBean;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import modelo.Usuario;
import util.DAO;
import util.HibernateUtil;

@ManagedBean //gera os new
public class UsuarioBean {

    EntityManager manager = HibernateUtil.getManager();
    private Usuario user = new Usuario();
    private DAO dao = new DAO();
    private TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo");
    List<Usuario> lista;

    public TimeZone getTz() {
        return tz;
    }

    public void setTz(TimeZone tz) {
        this.tz = tz;
    }

    public Usuario getUser() {
        return user;
    }

    public void setUser(Usuario user) {
        this.user = user;
    }

    public void newInstance() {
        user = new Usuario();
    }

    public void inserirUsuario() {
        manager.getTransaction().begin();
        manager.persist(user);
        manager.getTransaction().commit();

        user = new Usuario();
    }

    public List listarTodosUsuarios() {
        Query query = manager.createQuery("select u from Usuario u");
        lista = (List<Usuario>) query.getResultList();
        if (lista.isEmpty()) {
        }
        return lista;

    }

    public List getUsuarios() {
        return listarTodosUsuarios();

    }

    public String remove() {

        try {
            manager.getTransaction().begin();
            manager.remove(user);
            manager.getTransaction().commit();

            newInstance();
            lista = null;

            return "sucesso";
        } catch (Exception e) {
            e.printStackTrace();
            return "falhou";
        }
    }

    public String update() {

        try {
            manager.getTransaction().begin();
            manager.merge(user);
            manager.getTransaction().commit();

            newInstance();

            return "sucesso";
        } catch (Exception e) {
            e.printStackTrace();
            return "falhou";
        }
    }

    public List buscarClientePorNome(String nome) {
        Query query = manager.createQuery("select u from Usuario u where nome like :nome");
        query.setParameter("nome", nome);
        lista = (List<Usuario>) query.getResultList();
        if (lista.isEmpty()) {
            return null;
        }
        return lista;
    }
}
R

Essa anotação: @ManagedBean
substitui o arquivo.

Tenta fazer assim no método de pesquisa:

public List buscarClientePorNome() {  
        Query query = manager.createQuery("select u from Usuario u where nome like :nome");  
        query.setParameter("nome", user.getNome());  
        lista = (List<Usuario>) query.getResultList();  
        if (lista.isEmpty()) {  
            return null;  
        }  
        return lista;  
}  
//se não funcionar tenta assim:
private String nome; //gerar o get/set

public List buscarClientePorNome() {  
        Query query = manager.createQuery("select u from Usuario u where nome like :nome");  
        query.setParameter("nome", nome);  
        lista = (List<Usuario>) query.getResultList();  
        if (lista.isEmpty()) {  
            return null;  
        }  
        return lista;  
} 
//nesse segundo caso deixe na página assim:
<h:inputText  value="#{usuarioBean.nome}" />
A

Agora qualquer ação que eu tento fazer tá dando este erro…e parou de listar!!! e eu não fiz nada…pq está acontecendo isso??

/buscar.xhtml @36,114 value="#{usuarioBean.user.nome}": Target Unreachable, identifier ‘usuarioBean’ resolved to null

A

Deu certooooo! Eu tinha refatorado um arquivo, por isso tava dando erro..mas engraçado o netbeans não ter atualizado o projeto td né? :evil:

ficou assim:
public List buscarClientePorNome() {
        Query query = manager.createQuery("select u from Usuario u where nome like :nome");
        query.setParameter("nome", nome);
        lista = (List<Usuario>) query.getResultList();
        if (lista.isEmpty()) {
            return null;
        }
        return lista;
    }

    public List getBuscaUsuarios() {
        return buscarClientePorNome();

    }
        return lista;
    }

e no jsf:

<?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">
    <h:head>
        <link rel="stylesheet" type="text/css"  href="estilo.css"/>
        <title>Controle de Usuários</title>
    </h:head>
    <h:body>

        <div id="geral">
            <div id="content">
                <div id="cabecalho">
                    <div id="intCab">Controle de Usuários</div><!--fim intCab--><br />
                    <div id="subTitulo">
                        <h:form>Você está em:&nbsp;&nbsp;
                            <h:outputLink value="index.xhtml" styleClass="umlink" >
                                <f:verbatim>Home</f:verbatim>
                            </h:outputLink>&nbsp;&nbsp;>>&nbsp;&nbsp;
                            <h:outputLink value="buscar.xhtml" styleClass="doislink" >
                                <f:verbatim>Buscar</f:verbatim>
                            </h:outputLink>
                        </h:form>
                    </div><!--fim subtitulo-->
                </div><!--fim cabecalho-->
                <div id="conteudo">
                    <div id="contPrincipal">
                        <h:form>

                            <table width="500" align="center">
                                <tr>
                                    <td colspan="2" align="right"><h:outputText value="Informe o nome do usuário a ser pesquisado" /></td>
                                </tr>
                                <tr>
                                    <td align="right"><h:inputText  value="#{usuarioBeans.nome}" /></td>
                                    <td align="left"><h:commandButton value="Pesquisar" action="#{usuarioBeans.buscarClientePorNome}"></h:commandButton></td>
                                </tr>
                            </table>
                            <br /><br /><br />
                            <!--Início tabela de lista-->
                            <h:dataTable value="#{usuarioBeans.buscaUsuarios}" var="usuario" styleClass="orders" headerClass="ordersHeader" columnClasses="oddColumn" rowClasses=" eveRow, oddRow">
                                <h:column>
                                    <f:facet name="header">
                                        Id
                                    </f:facet>
                                    #{usuario.id}
                                </h:column>
                                <h:column>
                                    <f:facet name="header">
                                        Nome
                                    </f:facet>
                                    #{usuario.nome}
                                </h:column>
                                <h:column>
                                    <f:facet name="header">
                                        Login
                                    </f:facet>
                                    #{usuario.login}
                                </h:column>
                                <h:column>
                                    <f:facet name="header">
                                        Senha
                                    </f:facet>
                                    #{usuario.senha}
                                </h:column>
                                <h:column>
                                    <f:facet name="header">
                                        Data de nascimento
                                    </f:facet>
                                    #{usuario.datanascimento}
                                </h:column>
                                <h:column>
                                    <f:facet name="header">
                                        Observações
                                    </f:facet>
                                    #{usuario.observacoes}
                                </h:column>
                            </h:dataTable> <!--Fim tabela de lista--> 

                        </h:form>
                    </div><!--fim contPrincipal-->
                    <div id="lateral">
                        <br />
                        <br />
                        <br />
                        <f:view>
                            <h:form>
                                <h:outputLink value="index.xhtml" styleClass="link" >
                                    <f:verbatim>Home</f:verbatim>
                                </h:outputLink>
                                <br /><br />
                                <h:outputLink value="inserir.xhtml" styleClass="link" >
                                    <f:verbatim>Inserir</f:verbatim>
                                </h:outputLink>
                                <br /><br />
                                <h:outputLink value="buscar.jsf" styleClass="link">
                                    <f:verbatim>Buscar</f:verbatim>
                                </h:outputLink>
                                <br /><br />
                                <h:outputLink value="listar.xhtml" styleClass="link">
                                    <f:verbatim>Listar</f:verbatim>
                                </h:outputLink>
                                <br /><br />
                                <h:outputLink value="atualizar.xhtml" styleClass="link">
                                    <f:verbatim>Atualizar</f:verbatim>
                                </h:outputLink>
                                <br /><br />
                                <h:outputLink value="remover.xhtml" styleClass="link">
                                    <f:verbatim>Remover</f:verbatim>
                                </h:outputLink>

                            </h:form>
                        </f:view>
                    </div><!--fim lateral-->
                </div><!--fim conteudo-->
                <div id="rodape">
                    <p>IFSul - 2011/2</p>
                    <p>TAP - Tópicos Avançados em Programação</p>
                    <p>Ariane Rebellato</p>
                    <p>&nbsp;</p>
                </div><!--fim rodape-->
            </div><!--fim content-->
        </div><!--fim geral-->

    </h:body>
</html>

Obrigada pela força!!
Ainda vou implementar o atualizar, então, se eu precisar me ajudemm!! ehehe
Abração

Criado 2 de outubro de 2011
Ultima resposta 3 de out. de 2011
Respostas 16
Participantes 4