JSF 2.0 - Navegação e ManagedBean

15 respostas
L

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…

15 Respostas

M

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

L

A classe Cliente já tem os getters e setters…

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

F

Sobre a navegação no JSF 2.0

M

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?!

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

L

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

M

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

L

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:
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;
    }   
}
Classe PessoaDAO, pacote dao:
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);
        }
    }
}
Classe PessoaBean, pacote controle:
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";
    }
}
Página inserir.xhtml:
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>.:: Inserindo nova Pessoa ::.</title>
    </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>
</html>
H

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.

M

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.

H

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

L
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:
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("[telefone removido]");
        
        PessoaDAO pessoaDAO = new PessoaDAO();
        
        pessoaDAO.adiciona(pessoa);
    }
}
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?!
J

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.

L

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
A

[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?

L

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.

Criado 6 de julho de 2011
Ultima resposta 8 de jul. de 2011
Respostas 15
Participantes 6