JSF - Consulta no Banco

Boa tarde, Galera !
estou estudando JSF, no momento criando apenas um formulario seguindo um exemplo de um tutorial na net…

Mas estou com um problema na hora da consulta, estou olhando o script a dias e não sei como resolver…

se algum poder me dar uma luz, ou sabe de algum material completo de jsf eu agradeço eu achei um exemplo com hibernet, mas creio
que ainda não está da hora de eu misturar…

Vou colocar aqui apenas os pontos necessários à consulta…


//FacesConfig

</description>
        <managed-bean-name>Clic</managed-bean-name>
        <managed-bean-class>br.com.integrator.util.CliControler</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

//Controler

         public String efetuaconsulta() throws Exception {
           DAO dao = new ClienteDAOImp(); 
           dao.efetuaconsulta();
         return "ResultConsult";
     }
//Interface DAO

public interface DAO {

    void salvar(Cliente cliente) throws Exception;

    public String efetuaconsulta() throws Exception;

}
//Manipula Interface

public class ClienteDAOImp implements DAO{

//public class ClienteDAOImp{

    private Connection conn;

    private static final String ResultConsult = "Sucess";

    /*Construtor que se conecta no banco de dados
     * @throws java.lang.Exception se não houver
     */

    public ClienteDAOImp() throws Exception{
        try{
            this.conn = ConnectionFactory.getConnection();
        }catch(Exception e){
            throw new Exception( "Erro: " +
                    "\n" + e.getMessage( ) );
            
        }


    }

    public void salvar(Cliente cliente) throws Exception{
        PreparedStatement ps = null;
        Connection conn = null;
        if(cliente == null) throw new Exception("O valor passado não pode ser Nullo");
        try {
            String SQL = "INSERT INTO cliente(nome, email)"+"values (?,?)";
            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.setString(1,cliente.getNome());
            ps.setString(2,cliente.getEmail());

            ps.executeUpdate();
         }catch(SQLException sqle){
             throw new
                     Exception("Erro ao inserir dados "+sqle);

        }finally {
            ConnectionFactory.closeConnection(conn,ps);
        }
    }
       
    //Metodo que efetua consulta e me retorna os clientes
    
       public String efetuaconsulta() throws Exception{
        

        ResultSet rs;
        PreparedStatement ps = null;
        Connection conn = null;
        Statement stm = null;
        gerenciaCliente listacliente = null;

        if("?" == null) throw new Exception("O valor passado não pode ser Nullo");
        try {
           stm = conn.createStatement();
          rs = stm.executeQuery("select nome,email from cliente where nome = ' ? '");
          //Cliente cli = new Cliente();
          if (rs.next()){
              Cliente cli = new Cliente();
              cli.setNome(rs.getString("nome"));
              cli.setEmail(rs.getString("email"));
              listacliente.adiciona(cli);
            }
          return ResultConsult;
            
         }catch(SQLException sqle){
             throw new
                     Exception("Erro ao inserir dados "+sqle);

        }finally {
            ConnectionFactory.closeConnection(conn,ps);
        }
     
    }

}


//Consulta

 <f:view>
        <h:form id="form1">
            <h:panelGrid columns="3">
                <f:facet name="header">
                <h:outputText value="::Consultar Clientes"/>
                </f:facet>
                <h:outputText value="Nome" />
                <h:inputText id="nome"  value="#{Clic.cliente.nome}"  />
                
            </h:panelGrid>
            <h:commandButton value="Consultar" action="#{Clic.efetuaconsulta}" />
            <h:commandButton value="Limpar" type="reset" />

            <h:commandLink value="Cancelar" action="cancelar" immediate="true" />






        </h:form>
     </f:view>

Obrigado

está dando null pointer…
vc já verificou esta linha?

Connection conn = null; 

vc tem que dar uma instancia de conexão para o conn…
senão não vai haver conexão com o banco de dados…

O que tem nesta linha?

br.com.integrator.dao.ClienteDAOImp.efetuaconsulta(ClienteDAOImp.java:82) 

Velho o problema é o con ele não esta estabelecendo uma conexão com o banco ele está com o null desse jeito não roda.

Abraço

Meu amigo, mostra o conteúdo de:

ConnectionFactory.[u]getConnection[/u]();

e tambem, como vc esta estudando por um exemplo , vc tem que ver se vc criou o banco e precisa colocar o caminho do banco, login e a senha.
Seria bom vc mostrar como esta sua conexão com o banco.

Boa noite , Galera !

justamente o problema era com o CONN…

em relação ao oque tem na mensagem da linha 82, é que estava chamando a classe statement…

Então Galera, eu tirei o null e inicializei cada connection com a classe ConnectionFactory.getConnection();

eu não sei se está certa eu tratar a variavel conn desta forma porém sabe como é iniciante né…rs

Por enquanto tá funcionando se alguem tiver alguma dica, em relação a isto segue como ficou…


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.integrator.dao;


import br.com.cliente.Cliente;
import br.com.integrator.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;



/**
 *
 * @author Osvaldo
 */
public class ClienteDAOImp implements DAO{

//public class ClienteDAOImp{

    private Connection conn;

   String ResultConsult = "Sucess";

    /*Construtor que se conecta no banco de dados
     * @throws java.lang.Exception se não houver
     */

    public ClienteDAOImp() throws Exception{
        try{
            this.conn = ConnectionFactory.getConnection();
        }catch(Exception e){
            throw new Exception( "Erro: " +
                    "\n" + e.getMessage( ) );
            
        }


    }

    public void salvar(Cliente cliente) throws Exception{
        PreparedStatement ps = null;
        Connection conn2 = ConnectionFactory.getConnection();
        if(cliente == null) throw new Exception("O valor passado não pode ser Nullo");
        try {
            String SQL = "INSERT INTO cliente(nome, email)"+"values (?,?)";
            conn2 = this.conn;
            ps = conn2.prepareStatement(SQL);
            ps.setString(1,cliente.getNome());
            ps.setString(2,cliente.getEmail());

            ps.executeUpdate();
         }catch(SQLException sqle){
             throw new
                     Exception("Erro ao inserir dados "+sqle);

        }finally {
            ConnectionFactory.closeConnection(conn2,ps);
        }
    }
       
    //Metodo que efetua consulta e me retorna os clientes
    
       public String efetuaconsulta() throws Exception{
        

        ResultSet rs;
        PreparedStatement ps = null;
        Connection conn3 = ConnectionFactory.getConnection();

        Statement stm = null;
        gerenciaCliente listacliente = null;

        if("?" == null) throw new Exception("O valor passado não pode ser Nullo");
        try {
           stm = conn3.createStatement();
          rs = stm.executeQuery("select email from cliente where nome = ' ? '");
          //Cliente cli = new Cliente();
          if (rs.next()){
              Cliente cli = new Cliente();
              cli.setNome(rs.getString("nome"));
              cli.setEmail(rs.getString("email"));
              listacliente.adiciona(cli);
            }
          return "ResultConsult";
            
         }catch(SQLException sqle){
             throw new
                     Exception("Erro ao inserir dados "+sqle);

        }finally {
            ConnectionFactory.closeConnection(conn3,ps);
        }
     
    }

}

Agora estou com um outro problema, como JSF eu entendi que na consulta utilizando lista eu trabalho da seguinte forma…

Eu tenho uma classe que auxilia na criação da lista…


public class gerenciaCliente {
    
    private List<Cliente> lista = null;
    
    public gerenciaCliente(){
        
        lista = new ArrayList<Cliente>();
    }

        public boolean adiciona(Cliente novo){

        return lista.add(novo);

    }

        public List<Cliente> getLista(){
            return lista;
        }


}

Tenho um metodo “efetuaConsulta” que adiciona os valores em uma lista, este metodo está na classe “ClienteDAOImp” mostrada acima …

Abaixo eu tenho o JSF que recupera os valores da lista, ou melhor devia recuperar e mostrar


<f:view>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>JSP Page</title>
        </head>
        <body>
            <%-- o Value da Data table é a lista clientes --%>    
            <h:dataTable value="#{ListPessoa.lista}" var="Cliente">


        <h:column>
        <f:facet name="header">
            <h:outputText value="Nome"/>
        </f:facet>
            <h:outputText value="#{Cliente.nome}"/>
             </h:column>

         <h:column>

        <f:facet name="header">
            <h:outputText value="Email"/>
        </f:facet>
        <h:outputText value="#{Cliente.email}"/>
          </h:column>


          </h:dataTable>
     
        </body>
    </html>
</f:view>

oque acontence é que não da erro nenhuma, apenas não vem nenhuma valor.

Por este motivo não sei nem como encontrar este valor.

Obs:
O banco está alimentado, a parte de cadastro está funcionando…

Depois eu vou acrescetar todas as classe, é qui agora eu estou com um pouco de sono…

Por favor galera ajuda…

Grande Abraço , Boa Noite !!

Boa Tarde, Galera !

ainda não consegui fazer este esquema funcionar, o formulário result apenas me mostra os campos e não os resultados de output
dos valores que teoricamente seriam recupeados da lista.

Abaixo segue o Managed Bean, nele eu coloquei a classe que gerencia minha lista…

Se alguem puder me ajudar eu tiver algum exemplo similar…

oque estou tentando fazer é via JSF recupera uma valor cadastrado no banco…

//Manage Bean
   <managed-bean>
        <description>
            classe reponsavel por montar e desmonta a lista de pessoas
        </description>
        <managed-bean-name>ListPessoa</managed-bean-name>
        <managed-bean-class>br.com.integrator.dao.gerenciaCliente</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

Está é classe Cliente, está classe que eu tenho os Getter e Setters

//Classe Cliente

public class Cliente {

private int id;
private String nome = null;
private String email = null;

public Cliente(int id, String nome, String email){
    this.id = id;
    this.nome = nome;
    this.email = email;

}
public Cliente(){
      this.id = 0;
    this.nome = null;
    this.email = null;
    
}

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome2) {
        this.nome = nome2;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }
}


Está aqui é classe que manipula a lista…

//Manipula o List de Cliente

public class gerenciaCliente {
    
    private List<Cliente> lista = null;
    
    public gerenciaCliente(){
        
        lista = new ArrayList<Cliente>();
    }

        public boolean adiciona(Cliente novo){

        return lista.add(novo);

    }

        public List<Cliente> getLista(){
            return lista;
        }


}
//consulta no banco

              //Aqui eu acho que pode estar ocorrendo um erro, estou com dificuldade
        //  de recuperar do fomulario consula a String reponsavel pelo where
        //  não sei está certa da forma que eu fiz colando "?" pelo menos não está me mostrando
        //  a excessão


//mostra os clientes recuperados

<f:view>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>JSP Page</title>
        </head>
        <body>
            <%-- o Value da Data table é a lista clientes --%>    
            <h:dataTable value="#{ListPessoa.lista}" var="Cliente">


        <h:column>
        <f:facet name="header">
            <h:outputText value="Nome"/>
        </f:facet>
           //aqui tá estranho parece o o Value Cliente não recupear o nome....................
            <h:outputText value="#{Cliente.nome}"/>
             </h:column>

         <h:column>

        <f:facet name="header">
            <h:outputText value="Email"/>
        </f:facet>
        <h:outputText value="#{Cliente.email}"/>
          </h:column>


          </h:dataTable>
     
        </body>
    </html>
</f:view>

amigo, posso estar errado, mas quando vc faz a pesquisa, e depois adiciona os itens na lista, vc não está retornando esta lista para nenhum lugar…
talvez seja esse o problema dele não mostrar nenhum valor

Então, isto mesmo ein…

Tipo isto que estou meio perdido no JSF no caso do Servlet eu monto a lista do um request.getRequestDispatcher para para o JSP que pega o parametro
e desmonta a lista…

Agora no caso do JSF estou fazendo o seguinte, tipo creio que eu entendi errado. No metodo de consulta eu retorno uma String = Sucess
dai no faces-config eu disparo para uma jsp que é onde eu recupero os valores…

O Certo na consulta seria eu dar uma return da List ?
mas como eu iria para o JSP resultConsulta…

        <from-outcome>Sucess</from-outcome>
        <to-view-id>/resultConsulta.jsp</to-view-id>
<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
    <managed-bean>
        <description>
            classe que acessa o bean, dao e  manipula campos JSF
        </description>
        <managed-bean-name>Clic</managed-bean-name>
        <managed-bean-class>br.com.integrator.util.CliControler</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

   <managed-bean>
        <description>
            classe reponsavel por montar e desmonta a lista de pessoas
        </description>
        <managed-bean-name>ListPessoa</managed-bean-name>
        <managed-bean-class>br.com.integrator.dao.gerenciaCliente</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>


    <navigation-rule>
        <from-view-id>/menu.jsp</from-view-id>
        <navigation-case>
            <from-outcome>novocadastro</from-outcome>
            <to-view-id>/formAutor.jsp</to-view-id>
        </navigation-case>
             <from-view-id>/menu.jsp</from-view-id>
        <navigation-case>
            <from-outcome>consulta</from-outcome>
            <to-view-id>/consultar.jsp</to-view-id>
        </navigation-case>
                

    </navigation-rule>

    <navigation-rule>
        <from-view-id>/formAutor.jsp</from-view-id>
        <navigation-case>
            <from-outcome>cancelar</from-outcome>
            <to-view-id>/cancelado.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>salvar</from-outcome>
            <to-view-id>/cancelado.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

    <navigation-rule>
        <from-view-id>/consultar.jsp</from-view-id>
        <navigation-case>
            <from-outcome>Sucess</from-outcome>
            <to-view-id>/resultConsulta.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>


</faces-config>

Ai Ai, Este negocio é muito phoda !!

Obrigado

quem que chama esse método efetuaconsulta()?
vc vai retornar para ele está lista para depois setar ele na sua lista que vc vai mostrar na página, e é a classe que vai receber esta lista vc pode encaminhar para as demais páginas

Quem chama é a JSP Consulta:

<%--
    Document   : formAutor
    Created on : 19/05/2011, 12:43:01
    Author     : Osvaldo
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">


    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>JSP Page</title>
        </head>
<body>
        <f:view>
        <h:form id="form1">
            <h:panelGrid columns="3">
                <f:facet name="header">
                <h:outputText value="::Consultar Clientes"/>
                </f:facet>
                <h:outputText value="Nome" />
                <h:inputText id="nome"  value="#{Clic.cliente.nome}"  />
                
            </h:panelGrid>
             //Chamando Metodo Consulta
            <h:commandButton value="Consultar" action="#{Clic.efetuaconsulta}" />
            <h:commandButton value="Limpar" type="reset" />

            <h:commandLink value="Cancelar" action="cancelar" immediate="true" />






        </h:form>
     </f:view>
</body>
    </html>

Então é que o seguinte eu não tenho que falar no Faces-Config que a pagina que eu quero ver agora é
resultConsulta…
Por isso que eu havia retornado uma String Sucess…

Se eu retornar a List, como eu jogo para o resultConsult, como se fosse um servlet ?


    <navigation-rule>
        <from-view-id>/consultar.jsp</from-view-id>
        <navigation-case>
            <from-outcome>Sucess</from-outcome>
            <to-view-id>/resultConsulta.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

puts bixo…
servlet eu já mexi, mas nem sei te explicar como q vc vai fazer isso…
eu to utilizando managedBean agora…
para min ficou bem mais fácil e claro de como as coisas funcionam…
=]

Icho, no meu casa to quase abandonando JSF e usando somente Servlet, para que é mais claro…

Bom, oque estou pensando nesta consulta é o seguinte…

tipo eu quero mandar eu recupero o valor através do :

<h:commandButton value="Consultar" action="#{Clic.efetuaconsulta}" />

Ok, no metodo efetua consulta estou retornando uma lista do tipo telefones…

Agora para eu mostrar este valor, pode até mesmo ser na mesma pagina como que eu faço,
e pesquisei que a melhor forma é utilizar o Datatable, porém eu não consigo pegar este valor de volta
eu criei uma classe que gerencia a lista de clientes…

public class gerenciaCliente {
    
    private List<Cliente> lista = null;
    
    public gerenciaCliente(){
        
        lista = new ArrayList<Cliente>();
    }

        public boolean adiciona(Cliente novo){

        return lista.add(novo);

    }

        public List<Cliente> getLista(){
            return lista;
        }


}

e agora como faço para pegar a lista ?

Por favor preciso de apenas um exemplo ou apostila de consulta no banco alguem tem ?

Obrigado

Ninguem ?

Tente começar por coisas mais simples.
Tipo esse tutorialzinho.
De preferência teste as tags sem conectar a bancos de dados.
Divida os problemas.