JSF 2.0 - Navegação e ManagedBean

Olá,

Estou tentando desenvolver algo para web, para aprendizagem. Criei um projeto no NetBeans 7.0 utilizando o framework JSF 2.0 + PrimeFaces e estou com algumas dúvidas:

Antes (JSF 1.2) a “navegação” entre as páginas era feita por meio da configuração do arquivo faces-config.xml e agora, no JSF 2.0? Lí algo sobre não ser necessário a criação desse arquivo ou ainda fazer a configuração da navegação por meio de “anotações”. Poderiam me mostrar algum exemplo bem simples?

Outra dúvida é sobre o padrão MVC.
Imaginando um exemplo, um cadastro de Cliente (nome, endereço, cidade e telefone), me corrigindo quando eu errar:

O Model seria a classe: Cliente (com os getters e setters);
Poderia fazer o acesso ao banco com: ClienteDAO (instanciando um ConnectionFactory e com os códigos SQL para inserir, alterar, remover…);

O Controller seria a classe: clienteBean, que agora também pode ser definida por “anotações” (?);
As views seriam as páginas para visualizar: uma página inserirCliente.xhtml por exemplo. Mas, nessa página, não consegui usar o seguinte código:

<p:inputText value="#{clienteBean.cliente.nome}

O NetBeans informa que: Propriedade “cliente” desconhecida.

Poderiam me ajudar com essas dúvidas?! Talvez um exemplo do código acima…

Forte abraço e obrigado a todos…

Crie os get e set da propriedade.
Se já tiver criado…
Tente anotando a propriedade com @ManagedProperty(value=“cliente”)

A classe Cliente já tem os getters e setters…

Quanto a anotação @ManagedProperty(value=“cliente”), faço ela no Cliente ou no ClienteBean?!

Sobre a navegação no JSF 2.0

[quote=lksJF]A classe Cliente já tem os getters e setters…

Quanto a anotação @ManagedProperty(value=“cliente”), faço ela no Cliente ou no ClienteBean?![/quote]

Anota o Cliente no ClienteBean, ou seja, você irá anotar a propriedade Cliente do Bean ClienteBean.

Obrigado finotti, melhorei o entendimento sobre a navegação implícita do JSF 2.0

Quanto ao código que postei, ainda não consegui fazer funcionar, mesmo inserindo a anotação enviada por Mr.style.

O NetBeans segue me informando: Propriedade “cliente” desconhecida

Poste seu códido então para nos facilitar.

Muito obrigado Mr.style pelo interesse em me ajudar! Obrigado mesmo…

Refiz o código e continuo com o problema… segue abaixo o código referente a página para cadastrar PESSOA.

Classe Pessoa, pacote modelo:

[code]public class Pessoa {
private String nome;
private String endereco;
private String cidade;
private String telefone;

public String getCidade() {
    return cidade;
}

public void setCidade(String cidade) {
    this.cidade = cidade;
}

public String getEndereco() {
    return endereco;
}

public void setEndereco(String endereco) {
    this.endereco = endereco;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getTelefone() {
    return telefone;
}

public void setTelefone(String telefone) {
    this.telefone = telefone;
}   

}[/code]

Classe PessoaDAO, pacote dao:

[code]import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import modelo.Pessoa;

public class PessoaDAO {

// a conexão com o banco de dados
private Connection connection;

public PessoaDAO() {
    this.connection = new ConnectionFactory().getConnection();
}

public void adiciona(Pessoa pessoa) throws SQLException {
    String sql = "INSERT INTO pessoa (nome,endereco,cidade,telefone) VALUES (?,?,?,?)";
    try {

// prepared statement para inserção
PreparedStatement stmt = connection.prepareStatement(sql);
// definindo valores para os ?
stmt.setString(1, pessoa.getNome());
stmt.setString(2, pessoa.getEndereco());
stmt.setString(3, pessoa.getCidade());
stmt.setString(4, pessoa.getTelefone());
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}[/code]

Classe PessoaBean, pacote controle:

[code]import dao.PessoaDAO;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import modelo.Pessoa;

@ManagedBean(name=“pessoaBean”)
@RequestScoped
public class PessoaBean {

private PessoaDAO pessoaDAO;
@ManagedProperty(value="pessoa")
private Pessoa pessoa = new Pessoa();

public String inserir() {
    pessoaDAO = new PessoaDAO();
    try {
        pessoaDAO.adiciona(pessoa);
        System.out.println("inserindo pessoa");
        return "erro";
    } catch (SQLException ex) {
        Logger.getLogger(PessoaBean.class.getName()).log(Level.SEVERE, null, ex);
    }
    return "index";
}

}[/code]

Página inserir.xhtml:

[code]
<h:head>
.:: Inserindo nova Pessoa ::.
</h:head>
<h:body>
<h:form>
<h:outputText value=“Nome: “/>
<p:inputText value=”#{pessoaBean.pessoa.nome}”/>
<h:outputText value=“Endereço: “/>
<p:inputText value=”#{pessoaBean.pessoa.endereco}”/>
<h:outputText value=“Cidade: “/>
<p:inputText value=”#{pessoaBean.pessoa.cidade}”/>
<h:outputText value=“Telefone: “/>
<p:inputText value=”#{pessoaBean.pessoa.telefone}”/>
<p:commandButton action="#{pessoaBean.inserir()}" value=“Inserir” />
</h:form>
</h:body>

[/code]

No pessoaBean você está falando que a propriedade pessoa deve ser injetada. E, pelo visto, você não possui um recurso chamado pessoa, gerenciado pelo JSF. O raciocínio é este para JSF 1.2, creio que seja o mesmo para JSF 2.0.

Você está querendo uma nova pessoa, ou está querendo que o objeto pessoa que você instanciou, esteja disponível para o JSF? Acredito que a primeira pergunta que tem resposta afirmativa. Se assim for você pode fazer o seguinte

@ManagedBean(name="pessoaBean")  
@RequestScoped  
public class PessoaBean {  
  
    private PessoaDAO pessoaDAO;
    private Pessoa pessoa;

    @PostConstruct
    public void init(){
         this.pessoa = new Pessoa();
    }

    public String inserir() {  
        pessoaDAO = new PessoaDAO();  
        try {  
            pessoaDAO.adiciona(pessoa);  
            System.out.println("inserindo pessoa");  
            return "erro";  
        } catch (SQLException ex) {  
            Logger.getLogger(PessoaBean.class.getName()).log(Level.SEVERE, null, ex);  
        }  
        return "index";  
    }  
}

Ou então inicializando a pessoa da mesma maneira que você está fazendo.

Cria um construtor vazio de PessoaBean e instancia uma nova pessoa nele.
Ou faça o que o Heder disse com a anotação @PostConstruct.

Melhor ainda, seria você inicializar o pessoaDAO também no método init().

Obrigado a todos que contribuíram.
Consegui resolver o problema da Propriedade desconhecida adicionando o seguinte código na classe PessoaBean:

public Pessoa getPessoa() { return pessoa; }
Agora me deparei com outro problema: ao executar e mandar inserir retorna o seguinte erro:

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/teste

Fiz a seguinte classe de teste pra verificar:

[code]package teste;

import dao.PessoaDAO;
import java.sql.SQLException;
import modelo.Pessoa;

public class testeConectar {
public static void main(String[] args) throws SQLException {
Pessoa pessoa = new Pessoa();
pessoa.setNome(“CLASSE DE TESTE3”);
pessoa.setEndereco(“RUA TESTE”);
pessoa.setCidade(“CIDADE TESTE”);
pessoa.setTelefone(“1234567890”);

    PessoaDAO pessoaDAO = new PessoaDAO();
    
    pessoaDAO.adiciona(pessoa);
}

}[/code]
Com a classe de teste consigo gravar normalmente no BD, mas quando executo a aplicação continuo com o erro:

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/teste

Sabem como corrigir esse problema?!

Cara ta faltando o jar o driver postgre na sua aplicação:

Na pasta LIB da sua aplicação tem que existir o JAR com o driver do postgre, pelo visto vc ja tem o JAR pois no teste ele funcionou acho q só falta mesmo vc colocar na pasta correta (pastabasedaplicacao\web-inf\lib)

Neste post foi tratado este assunto acho que pode ajudar vc tb.

jokacwb obrigado pela ajuda!

Testei o que me disse e ainda não funcionou… :?

Lembrando que estou utilizando o Netbeans 7.0 e o GlassFish 3.1.

No projeto, no Netbeans, eu adicionei o jar do postgresql-8.4-702.jdbc3.jar na parte de Bibliotecas (Botão direito em bibliotecas || Adicionar Jar/pasta). Mesmo fazendo isso é preciso fazer mais alguma configuração referente a essa biblioteca?! Adicionando ela por essa opção ela já não passa a ser utilizada pelo projeto?

Pelo fato da classe que fiz como teste, funcionar perfeitamente e conseguir inserir no banco, o erro de configuração não deve estar no GlassFish?!

Continuo com o mesmo erro:

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/teste

[quote=lksJF]jokacwb obrigado pela ajuda!

Testei o que me disse e ainda não funcionou… :?

Lembrando que estou utilizando o Netbeans 7.0 e o GlassFish 3.1.

No projeto, no Netbeans, eu adicionei o jar do postgresql-8.4-702.jdbc3.jar na parte de Bibliotecas (Botão direito em bibliotecas || Adicionar Jar/pasta). Mesmo fazendo isso é preciso fazer mais alguma configuração referente a essa biblioteca?! Adicionando ela por essa opção ela já não passa a ser utilizada pelo projeto?

Pelo fato da classe que fiz como teste, funcionar perfeitamente e conseguir inserir no banco, o erro de configuração não deve estar no GlassFish?!

Continuo com o mesmo erro:

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/teste

Quais são os .jars que você no seu projeto?

Eu adicionei o postgresql-8.4-702.jdbc3.jar e quando executo a aplicação, retorna esse erro.
Mas quando executo a classe de teste, consigo adicionar normalmente.