JSF como fazer um "find/busca" com criterio

9 respostas
K
Fala ae galera!!! Alguem poderia me ajudar a fazer uma busca numa tabela pelo JSF. Por exemplo, digito o CPF e quero que o nome do camarada seja buscado na tabela de Funcionarios. O meu Orientador do TCC faz uns codigos malucos mas nada funciona, poderiam me ajudar com isso por favor? tenho q me formar esse ano e dependo muito disso! Obrigado gente! Segue meu codigo... Quando eu abro essa pagina a tabela já aparece populada enquanto eu so quero que busque o que eu digitar no campo. ABRAÇOS!
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <ui:composition template="/templates/template.xhtml">

        <ui:define name="banner">ADMINISTRADOR</ui:define>

        <ui:define name="conteudo">
            <h1 align="center">FUNCIONARIO</h1>
            <h:form>
                <h:panelGroup id="messagePanel" layout="block">
                    <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
                </h:panelGroup>


                <h:inputText id="cpf" value="#{funcionarioController.cpf}" />
                <h:commandButton action="#{funcionarioController.achaFuncionarios}" value="Buscar"/>
                <h:outputText value="#{funcionarioController.obj.nome}"/>


                <h:dataTable border="1" value="#{funcionarioController.items}" var="row">
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="cpf"/>
                        </f:facet>

                        <h:outputText value="#{row.cpf}"/>

                    </h:column>
                </h:dataTable>
            </h:form>

        </ui:define>
    </ui:composition>

</html>

9 Respostas

A

Isso é muito simples!

Não é muito bom informar o código para você. No que você tem dúvida?

Mande mais detalhes do que você está usando.

H

Meu caro, vejo que você já está utilizando alguns recursos mais poderosos do facelets.
Mas é importante saber se você está utilizando algum outro framework, tal como spring ou hibernate, ou alguma biblioteca JSF, como o Richfaces.

Pelo visto o funcionarioController é um managed-bean do JSF. Você terá que atribuir o escopo de session para ele. Se tivesse usando Richfaces poderia usar o componente keepAlive, deixaria o trabalho mais fácil, além do mais poderia usar componentes que fornecem suporte ajax e a dataTable, com mais funcionalidades que a da biblioteca html ( <h:dataTable> ) .

Você está preenchendo a lista com os valores do banco antes de renderizar a página. No construtor você deve instanciar a coleção de itens (funcionarioController.items) e não executar o método que recupera os valores do banco.

Poste o código que fica mais fácil te ajudarmos!

Atenciosamente,

Helder Neres

K

Brother, não estou usando nenhum outro framework não. estou usando JPA e JSF apenas acho que o JPA ta acessando o BD com o toplink. Bem, segue abaixo todo o codigo que o meu professor fez. no managedbean eu reduzi o codigo pq tinha mais de 200 linhas. Obrigado pela ajuda Helder! Abs.

@ManagedBean(name = "funcionarioController")
@SessionScoped
public class FuncionarioController {

.
.
.
    public String achaFuncionarios() {
        obj = ejbFacade.findByNome(getNome());
        return null;
    }
.
.
.
@Stateless
public class FuncionarioFacade extends AbstractFacade&lt;Funcionario&gt; {
    @PersistenceContext(unitName = "PesquisaPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public FuncionarioFacade() {
        super(Funcionario.class);
    }

    public Funcionario findByNome(String nome){
        Query q = em.createNamedQuery("Funcionario.findByNome", Funcionario.class);
        q.setParameter(1, nome);
        return (Funcionario) q.getSingleResult();
    }

}
H
# @ManagedBean(name = "funcionarioController")  
# @SessionScoped  
# public class FuncionarioController {  
#   private Collection<Funcionario> funcionarios = new ArrayList<Funcionario>();


# .   public FuncionarioController(){
       }       
# .  
# .  
#     public String achaFuncionarios() {  
#         funcionarios = ejbFacade.findByNome(getNome());  
#         return "";  
#     }

Seu bean tem escopo de sessão(SessionScope). Como consequência ele é iniciado quando a sessão é iniciada e destruído quando a sessão é destruída. Então, você acessa a página pela primeira vez após reiniciar o servidor web, agora deve funcionar corretamente, pois o bean está sendo iniciado, a coleção de funcionários está vazia. Logo depois você preenche seu filtro e confirma a busca, daí seu managed-bean chamada sua facade e atribui a referencia da coleção de funcionários o valor retornado por ela. Até aí tudo bem, no entanto, como o bean tem escopo de sessão, na próxima requisição ele não será destruído e instanciado novamente, então a coleção de funcionarios referencia aquele valor retornado por sua facade. Consequentemente, apesar de ser uma nova requisição, logo de cara a dataTable vem com os valores preenchidos.

Solução rápida:

Baixe o richfaces versão 3.3.3 final compatível com jsf 2.0, ou uma das RC da versão 4, ou ainda uma outra biblioteca que possua um componente com a mesma finalidade, como o primefaces, e utilize o componente <a4j:keepAlive beanName=“funcionarioController” /> na sua página de busca e altere o escopo do bean para requisição(@RequestScope). Você está utilizando jsf2.0 e como consequência seria mais adequado você usar o primefaces, que tem uma configuração bem tranquila e já está melhor adequada a essa versão do jsf.

Espero ter ajudado e que você compreenda o motivo do erro.

J

Rapaz da uma olhada depois no frame PrimeFaces, acho ele bem legal…
Segue um exemplo para o que você ta querendo!
http://www.primefaces.org/showcase/ui/datatableFiltering.jsf

K

Galera, obrigado pela ajudar, eu achei interessante usar richfaces. Obrigado pelo link jweibe, mas não estou conseguindo colocar pra rodar aqui no netbeans, tem alguma configuração especial que eu deva fazer. pois baixei os jars do richfaces coloquei na biblioteca e atualizei o web.xml de acordo como vi na internet como deveria fazer. mas nao funciona. Sabem o motivo? Abs

H

Meu caro, o JSF 2.0 tem um escopo, chamado de escopo de visão, que é adequado para o que você quer. Ainda não trabalhei com o JSF 2.0, por isso não o conhecia.
Esse escopo parece ser o adequado para o que você quer. Ele mantém o bean “vivo” enquanto você não fazer uma requisição para outra página.
Então no lugar de @SessionScoped, coloque o @ViewScoped.

Sobre a biblioteca que queira utilizar, use o primefaces, ele está a frente no que diz respeito a JSF 2.0 e é mais fácil de configurar. Lá documentação do primefaces é mostrada a facilidade de iniciar a trabalhar com ele.

Espero ter ajudado.

V

Márcio,

Quando usei o RichFaces + NetBeans a primeira vez também passei muita raiva. Tive que ir reduzindo a versão do RichFaces até conseguir utilizá-lo no NetBeans. Consegui utilizar na versão 3.1.4.GA.

Dai o web.xml fica:

<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	 id="Nome da WebApp" version="2.5">

    <context-param>
        <param-name>org.richfaces.SKIN</param-name>
        <param-value>blueSky</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>
        <param-value>enable</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>

    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>richfaces</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>richfaces</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>default.html</welcome-file>
    </welcome-file-list>

    </web-app>

Espero ter ajudado!

Até +!

K

Galera, desculpa por demorar a responder!

Bom, gostaria de agradecer a todos pela atenção. Vocês são otimos! Bom eu resolvi usar o PrimeFaces, ele é excelente e muito mais facil de configurar basta baixar o .jar, colocar na biblioteca do projeto e colocar as taglibs. achei muito mais facil e está me atendendo.

Forte abraço a todos!!!

Criado 19 de março de 2011
Ultima resposta 24 de mar. de 2011
Respostas 9
Participantes 5