[Resolvido] JSF - erro ao passar parametro

9 respostas
mateus.cordeiro

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! :)

segue minha classe DAO:
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;
     }

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

<h:head>
        <title>Relatorio de Horas</title>
    </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>
</html>
Segue o bean:
@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;
        }
    
}

Obrigado pela ajuda!

9 Respostas

mauricioadl

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

drsmachado

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

mateus.cordeiro

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

drsmachado

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.

mateus.cordeiro
Seria algo assim:
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;
        }
    
}

Mas e o xhtml, como ficaria?

<h:head>
        <title>Relatorio de Horas</title>
    </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>
</html>
drsmachado
<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

mateus.cordeiro

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: [email removido]()
drsmachado
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(
mateus.cordeiro

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

Criado 16 de dezembro de 2011
Ultima resposta 16 de dez. de 2011
Respostas 9
Participantes 3