[Resolvido] JSF - erro ao passar parametro

Bom dia Senhores,
Antes de criar esse topico eu pesquisei e não consegui encontrar uma solução.
Essa semana é a primeira que estou trabalhando em cima do Java WEB, segui alguns tutoriais e cheguei no JSF que atende a minha necessidade do projeto.

Estou precisando fazer uma pagina onde passo o codigo do funcionario e ele gera uma lista com as horas que eles trabalharam.
Já consegui passando o valor o valor direto no sql.
Porem preciso pegar o valor do codigo do funcionario e passar como filtro para o banco.

Então entra a ajuda de vcs! :slight_smile:

segue minha classe DAO:

[code]public class HorasDAO {

private Conexao conexao;

public HorasDAO(){
    if (conexao == null){        
    conexao = new Conexao();
    }
} 
     
 public List<Horas> carrega(){ // carrega as informações do banco
    idusuario = Integer.parseInt(Id); //não sei onde buscar esse valor para filtrar o select
     List<Horas> hora = new ArrayList<Horas>();
     try{                  
     String sql = " SELECT * FROM tabcontrole WHERE cod_func = ? "
                 + " ORDER BY data_cont ";
     
     PreparedStatement ps = conexao.getConn().prepareStatement(sql);
     ps.setInt(1, idusuario);
     ResultSet rs = ps.executeQuery();
         
         while (rs.next()){
            Horas hr = new Horas();
            hr.setData(rs.getDate("data_cont"));
            hr.setEntrada(rs.getTime("entrada"));
            hr.setAlmoco(rs.getTime("almoco"));
            hr.setRetorno(rs.getTime("volta"));
            hr.setSaida(rs.getTime("saida"));
            hr.setAdicional(rs.getTime("adicional"));
            hr.setJustificativa(rs.getInt("idbanco"));
            hr.setObs(rs.getString("obs"));
            
            hora.add(hr);
         }
     }catch(SQLException e){
         e.printStackTrace();
     }finally{
         conexao.fecharConexao();
     }
     return hora;
 }

[/code]

Esse é o xhtml da pagina inicial, como pegar o parametro do inputText e passar no filtro do select?

[code] <h:head>
Relatorio de Horas
</h:head>
<h:body>
<h:form>
<h:outputLabel value=“Informe o codigo do usuario:”/>
<h:inputText id=“id” value="#{horasDAO.id}"/>
<h:commandButton action=“horas” value=“Horas” />
</h:form>
</h:body>

[/code]

Segue o bean:

[code]@Named
@SessionScoped
public class HorasBean implements Serializable{

    private HorasDAO horasDAO;
    private Horas horas = new Horas();
    private DataModel<Horas> horasTotal;
 
    public Horas getHoras() {
        return horas;
    }
    
    public void setHoras(Horas horas) {
        this.horas = horas;
    }

    public DataModel<Horas> getHorast() {
        horasDAO = new HorasDAO();
        List<Horas> horasList = horasDAO.carrega();
        horasTotal = new ListDataModel<Horas>(horasList);
        return horasTotal;
    }

    public void setHoras(DataModel<Horas> horasTotal) {
        this.horasTotal = horasTotal;
    }

}[/code]

Obrigado pela ajuda!

vc vai precisar criar uma classe ManagedBean com um atributo id e um metodo para chamar.

procura na net essa apostila: k19-k12-desenvolvimento-web-com-jsf2-e-jpa2

ela eh otima pra aprender jsf e ensina o que vc esta querendo fazer.

[]'s

E qual o erro do jsf, ao qual o título do tópico faz menção?

aparece “null”
An Error Occurred: null
Erro meu!

Primeiro, quando você tem:

<h:inputText id="id" value="#{horasDAO.id}"/>   

Significa que você precisa ter um managedbean chamado horasDAO, que contém um atributo chamado id e, você não o possui.

Não é uma regra, mas pense que para todas as jsf que irá criar (independente de ser jsp ou xhtml), você precisa ter um managedbean que irá tratar dos assuntos referentes à ela.

Esse é o primeiro passo.

Seria algo assim:

[code]import dao.HorasDAO;
import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import model.Horas;

@Named
@SessionScoped
@ManagedBean
public class HorasBean implements Serializable{

    private HorasDAO horasDAO;
    private Horas horas = new Horas();
    private DataModel<Horas> horasTotal;
    private String Id;

    public String getId() {
        return Id;
    }
    public void setId(String Id) {
        this.Id = Id;
    }

    public String CarregaHoras(){
        getHorast(getId());            
        return "horas";
    }
    
    
    public Horas getHoras() {
        return horas;
    }
    
    public void setHoras(Horas horas) {
        this.horas = horas;
    }

    public DataModel<Horas> getHorast(String Iduser) {
        horasDAO = new HorasDAO();
        List<Horas> horasList = horasDAO.carrega(Iduser);
        horasTotal = new ListDataModel<Horas>(horasList);
        return horasTotal;
    }

    public void setHoras(DataModel<Horas> horasTotal) {
        this.horasTotal = horasTotal;
    }

}[/code]

Mas e o xhtml, como ficaria?

[code] <h:head>
Relatorio de Horas
</h:head>
<h:body>
<h:form>
<h:outputLabel value=“Informe o codigo do usuario:”/>
<h:inputText id=“id” value="#{horasBean.id}"/>
<h:commandButton action="#{horasBean.carregaHoras}" value=“Carregar”/>
<h:commandButton action=“horas” value=“Horas” />
</h:form>
</h:body>

[/code]
<h:form>               
          <h:outputLabel value="Informe o codigo do usuario:"/>   
          <h:inputText id="id" value="#{horasBean.id}"/>   
          <h:commandButton action="#{horasBean.carregaHoras}" value="Carregar"/>   
//para que esta linha?
          <h:commandButton action="horas" value="Horas"  />   
      </h:form>  

A princípio, isto deve funcionar…
Afinal, o usuário preenche o id, clica em carregar e aciona o método carregaHoras (que no bean deve estar em minúscula, não é?).
Assim, como o jsf faz o mapeamento do atributo id ao elemento text cujo value aponta para esta variável, você já tem o parâmetro.
Daí, então, apenas chame o dao

Eu coloquei esse botão p chamar a pagina “horas” onde exibe as informações.

Ta dando esse erro agora:

javax.el.MethodNotFoundException: /index.xhtml @13,83 action="#{horasBean.carregaHoras}": Method not found: controller.HorasBean@190a2c8.carregaHoras()

Colocou o nome do método de acordo com a especificação javaBeans?
Ou seja, com a primeira letra em minúsculo e as demais, seguindo o camelCase (letras minúsculas e, caso haja concatenação de nomes, a primeira letra de cada nome será maiúscula:
metodoQueBuscaAlgo();
metodoQueRetornaAlgo();
metodo();
metodoComUmNomeExtremamenteGrandeEDificil();
)
Pois java é case sensitive e, na tua classe, o nome do método está errado

CarregaHoras(

Cara que coisa!
Muito obrigado!
Funcionou como eu queria!
Obrigado a todos!