[JSF] CommandButton não funciona

Oi pessoal…
To com o seguinte problema, eu tenho uma pagina jsf que ta usando um bean de uma classe, ai eu coloquei um commandButton pra ativar um metodo dessa classe, porém ele não ta fazendo nada…não da mensagem de erro nem ativa os breakpoints que eu coloquei no código.
Eu tenho outras paginas+classes do mesmo jeito e que funcionam direitinho…so que essa nao funciona de jeito nenhum. Alguem sabe o que pode ser? Valeu.
acompanhaTR.jsp

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ page import="acessoBanco.Sessao" %>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.*" %>
<f:view>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>SISTRACK</TITLE>
<link rel="stylesheet" href="css/styles.css">
</HEAD>
<body bgcolor="00007A">
<font  face="verdana">
<div align="center">
  
  <table border="0" cellpadding="0" cellspacing="0" width="750" height="750" bgcolor="#FFFFFF">
    <tr>
      <td width="750" height="100" colspan="3">
        <p align="center"><img src="images/banner.jpg" border="0"/></p></td>
    </tr>
    <tr>
      <td width="715" height="409" valign="top">
        <div align="center" style="overflow: auto">
          <table border="1" cellpadding="3" cellspacing="1" width="715" height="568">
            <tr>
              <td width="715" height="564" valign="top"> <h:form>
						<TABLE width="697">
							<TR align="right">
								<TD width="600" align="left"><font size="3" color="00007A"><b>Acompanhamento em Tempo Real</b></font></TD>
  			                  	<td width="100"><h:commandButton value="Iniciar Sessão" action="#{sessao.inicia}" /></td>
        			          	<td width="100"><h:commandButton value="Finalizar Sessão" action="#{sessao.finaliza}" /></td>
							</TR>
						</TABLE>
<table width="700">
                  <tr bgcolor="CCE2FF"> 
                    <td width="50"><div align="right">Sessão:</div></td>
                    <td width="344"><h:inputText value="#{sessao.nome}" style="width: 400px"/></td>
                  </tr>
                  <tr>	
                  <td width="50"><div align="right">Tolerância:</div></td>
                  <td width="344">
                  	<h:selectOneMenu id="descRelatorio" value="#{sessao.tolerancia}">
						<f:selectItem itemValue="0.05" itemLabel="0.1 segundo (±0.05)" />
						<f:selectItem itemValue="0.05" itemLabel="0.2 segundos (±0.1)" />
						<f:selectItem itemValue="0.05" itemLabel="0.3 segundos (±0.15)" />
						<f:selectItem itemValue="0.05" itemLabel="0.4 segundos (±0.2)" />
						<f:selectItem itemValue="0.05" itemLabel="0.5 segundos (±0.25)" />
						<f:selectItem itemValue="0.05" itemLabel="0.6 segundos (±0.3)" />
						<f:selectItem itemValue="0.05" itemLabel="0.7 segundos (±0.35)" />
						<f:selectItem itemValue="0.05" itemLabel="0.8 segundos (±0.4)" />
						<f:selectItem itemValue="0.05" itemLabel="0.9 segundos (±0.45)" />
						<f:selectItem itemValue="0.05" itemLabel="1.0 segundo (±0.5)" />
					</h:selectOneMenu>
 				</td>
                </tr>
                <tr bgcolor="CCE2FF"> 
                    <td width="50"><div align="right">Ambiente:</div></td>
                    <td >
                       <h:selectOneMenu id="descAmbiente" value="#{sessao.idAmbiente}">
					      <f:selectItems value="#{sessao.listaAmbiente}" />
					   </h:selectOneMenu>
					</td>
                </tr>
                </table>
                </h:form> </td>
          </tr>
        </table>
      </div>
    </td>
  </tr>
    <tr>
      <td width="750" height="30" colspan="3">
        <p align="center"> </p></td>
    </tr>  
  </table>
</div>

</font>
</body>
</HTML>
</f:view>

Sessao2.java

[code]package acessoBanco;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;

import calculos.ThreadPosicoes;

public class Sessao {

private int id=0;
private String nome="";
private Timestamp inicio;
private Timestamp fim;
private double tolerancia=0;
private int idAmbiente=0;
private List<SelectItem> listaAmbiente = new ArrayList<SelectItem>();


public int getId(){return id;}
public void setId(int i){id = i;}

public String getNome(){return nome;}
public void setNome(String n){nome = n;}

public Timestamp getInicio(){return inicio;}
public void setInicio(Timestamp ts){ inicio=ts;}

public Timestamp getFim(){return fim;}
public void setFim(Timestamp ts){ fim=ts;}

public double getTolerancia(){return tolerancia;}
public void setTolerancia(int t){tolerancia = t;}

public int getIdAmbiente(){return idAmbiente;}
public void setIdAmbiente(int idAmbiente) {this.idAmbiente = idAmbiente;}

public  List<SelectItem> getListaAmbiente() throws SQLException{  
	listaAmbiente.clear();
	Connection connection = acessoBanco.ConectaBanco.getConnection();	
    Statement statement = connection.createStatement();
    String query = "SELECT \"AMBI_ID\", \"AMBI_DESCRICAO\" FROM \"SISTRACK_AMBIENTE\" ORDER BY 1" ;
    ResultSet resultSet = statement.executeQuery(query);
    listaAmbiente.add( new SelectItem("0","Selecione"));
    while(resultSet.next()){ 
	  
    	listaAmbiente.add( new SelectItem(resultSet.getInt(1),resultSet.getString(2)));  
	}
return listaAmbiente;  
}  

public String inicia() throws Exception{
	
	int proxId=0;
	System.out.print("Teste\n");
	//Pega o tempo atual
	Calendar calendar = Calendar.getInstance();
	Date now = calendar.getTime();
	Timestamp currentTs = new Timestamp(now.getTime());
	//Conecta ao banco
	Connection connection = acessoBanco.ConectaBanco.getConnection();	
    Statement statement = connection.createStatement();
    String queryId = "SELECT MAX(\"SESS_SEQUENCIAL\") FROM \"SISTRACK_SESSAO\"";
    ResultSet rs = statement.executeQuery(queryId);
	rs.next();
	proxId = rs.getInt(1)+1;

	
    String query = "INSERT INTO \"SISTRACK_SESSAO\" VALUES ("+proxId+",'"+currentTs+"',"+null+",'"+nome+"')";
    statement.executeUpdate(query);
    
    ThreadPosicoes.executaCalculos();
    
    return("inicia");
}

public String finaliza() throws Exception{
	
	int idSessao=0;
	
	//Pega o tempo atual
	Calendar calendar = Calendar.getInstance();
	Date now = calendar.getTime();
	Timestamp currentTs = new Timestamp(now.getTime());
	//Conecta ao banco
	Connection connection = acessoBanco.ConectaBanco.getConnection();	
    Statement statement = connection.createStatement();
    //Seleciona o id da sessão
    String queryId = "SELECT \"SESS_SEQUENCIAL\" FROM \"SISTRACK_SESSAO\" WHERE \"SESS_DESCRICAO\" = '"+nome+"'";
    ResultSet rs = statement.executeQuery(queryId);
	rs.next();
	idSessao = rs.getInt(1);
	//Atualiza a tabela
    String query = "UPDATE \"SISTRACK_SESSAO\" SET \"SESS_FIM\" = '"+currentTs+"' WHERE \"SESS_SEQUENCIAL\" = "+idSessao;
    statement.executeUpdate(query);
    
  return("finaliza");

}

}
[/code]

faces.config

<managed-bean> <managed-bean-name>sessao</managed-bean-name> <managed-bean-class>acessoBanco.Sessao</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> <navigation-rule> <from-view-id>/acompanhaTR.jsp</from-view-id> <navigation-case> <from-outcome>inicia</from-outcome> <to-view-id>/inicio.jsp</to-view-id> </navigation-case> </navigation-rule>

Porque voce realiza esses imports??? Remova-os e tenta novamente.
Tentando reproduzir este ambiente, aqui funcionou.

Aproveitando a oportunidade, toma cuidado com essas queries espalhadas nos seus MBeans.

O que foi feito, SOMENTE na camada DAO.

[quote=alexmdo][quote]
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>
<%@ page import=“acessoBanco.Sessao” %>
<%@ page import=“java.util." %>
<%@ page import="java.sql.
” %>
[/quote]

Porque voce realiza esses imports??? Remova-os e tenta novamente.
Tentando reproduzir este ambiente, aqui funcionou.

Aproveitando a oportunidade, toma cuidado com essas queries espalhadas nos seus MBeans.

O que foi feito, SOMENTE na camada DAO.

[/quote]

Sou novo em jsf então estou tentando enteder as coisas ainda…
Eu tirei os 3 últimos imports, imagino que os dois primeiros eu preciso. Mesmo assim não funcionou.

Sobre os acessos a banco eu vou fazer um refactoring dessa aplicação ainda…ta meio bagunçado.

Sabe o que pode ser além disso? o faces.config tá certinho?
Não tenho ideia do que pode ser…

Ok. Precisando de ajuda neste refactoring (dicas), soh falar.

Bom, estou postando o projeto aqui para analise. Basicamente eh um New Project, copiando a JSP e o managed bean que voce informou. Como disse, aqui funcionou. Tenta realizar um compare dele pra ver se acha algum problema. Nao consigo imaginar o porque pra voce nao funciona…

[quote=alexmdo]Ok. Precisando de ajuda neste refactoring (dicas), soh falar.

Bom, estou postando o projeto aqui para analise. Basicamente eh um New Project, copiando a JSP e o managed bean que voce informou. Como disse, aqui funcionou. Tenta realizar um compare dele pra ver se acha algum problema. Nao consigo imaginar o porque pra voce nao funciona…
[/quote]

Pow…não tem diferença nenhuma. =/
Eu fiz um teste e coloquei isso aqui na action do botão:

<h:commandButton value="Iniciar Sessão" action="#{ambiente.efetuaCadastro}" />

‘ambiente’ é um outro bean que ta declarado no faces-config e esse metodo efetuaCadastro está sendo chamado funcionando direitinho na sua pagina de origem, só que aqui não é chamado igual ao metodo sessao.inicia. Fico pensando então que tem alguma coisa errada com a chamada do metodo, pois metodo nenhum é chamado pelo botão, mesmo os que estão funcionando em outras páginas.
Sabe o que pode ser?

------------------EDIT----------------------
O tomcat começou a dar uam mensagem…olha só:

WARNING: There should always be a submitted value for an input if it is rendered, its form is submitted, and it is not disabled or read-only. Component : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /acompanhaTR.jsp][Class: javax.faces.component.html.HtmlForm,Id: _idJsp1][Class: javax.faces.component.html.HtmlInputText,Id: _idJsp6]}

É só um warning…mas pode dar uma dica…

Nao entendi direito. Essa declaracao <h:commandButton value="Iniciar Sessão" action="#{ambiente.efetuaCadastro}" /> nao constava no exemplo que voce passou. O problema esta aonde neste momento? Nesta declaracao?

Teria como voce tirar evidencias do erro (Printscreen da tela) do ponto onde o clique do botao nao dispara o evento? E desta evidencia, postar o codigo dos componentes envolvidos (JSP, MBeans, faces-config.xml, etc…) ?

Nao consegui entender se o erro eh o mesmo agora…O projeto que subi, resolveu o primeiro problema?

[quote=alexmdo]Nao entendi direito. Essa declaracao <h:commandButton value="Iniciar Sessão" action="#{ambiente.efetuaCadastro}" /> nao constava no exemplo que voce passou. O problema esta aonde neste momento? Nesta declaracao?

Teria como voce tirar evidencias do erro (Printscreen da tela) do ponto onde o clique do botao nao dispara o evento? E desta evidencia, postar o codigo dos componentes envolvidos (JSP, MBeans, faces-config.xml, etc…) ?

Nao consegui entender se o erro eh o mesmo agora…O projeto que subi, resolveu o primeiro problema?[/quote]

O erro ainda é o primeiro…o que eu quis mostrar eh que mesmo mudando o metodo chamado pra um outro metodo ( de até outro bean) ele continua sem chamar. Dai eu imagino que tem alguma coisa errada com a chamada do metodo.
Essa linha ai é uma edição do jsp original que era assim.

<h:commandButton value="Iniciar Sessão" action="#{sessao.inicia}" />

por essa

<h:commandButton value="Iniciar Sessão" action="#{ambiente.efetuaCadastro}" />  

só para mostrar que mesmo chamando outro metodo ele não executa (sendo que esse metodo é chamado em outro jsp e funciona).

É difícil mostrar evidência do erro pq não acontece nada. Eu clico no botão “Iniciar Sessão”, e pelo o que notei agora, ele carrega a propria pagina acompanhaTR.jsp novamente (vejo isso porque ele acessa uma classe de conexão ao banco para carregar o menu do ambiente (#{sessao.listaAmbiente}.

Segue o faces-config completo.

[code]<?xml version='1.0' encoding='UTF-8'?>

* ambiente /cadastroAmbiente.jsp acompanhamento /acompanhaTR.jsp leitor /cadastroLeitor.jsp etiqueta /cadastroEtiqueta.jsp setor /cadastroSetor.jsp locaLeitor /cadastroLocaLeitor.jsp relatorios /selecionaRelatorios.jsp calibracao /cadastroCalibracao.jsp ambiente acessoBanco.Ambiente request /cadastroAmbiente.jsp success /WEB-INF/results/sucessoCadAmbiente.jsp erroPk /WEB-INF/results/erroPkAmbiente.jsp lista /listaAmbiente.jsp /sucessoCadAmbiente.jsp ambiente /cadastroAmbiente.jsp /erroPkAmbiente.jsp ambiente /../cadastroAmbiente.jsp /listaAmbiente.jsp ambiente /cadastroAmbiente.jsp sessao acessoBanco.Sessao request /acompanhaTR.jsp inicia /servletTR leitor acessoBanco.Leitor request /cadastroLeitor.jsp success /WEB-INF/results/sucessoCadLeitor.jsp erroPk /WEB-INF/results/erroPkLeitor.jsp lista /listaLeitor.jsp /sucessoCadLeitor.jsp leitor /cadastroLeitor.jsp /erroPkLeitor.jsp leitor /../cadastroLeitor.jsp /listaLeitor.jsp leitor /cadastroLeitor.jsp [/code]

Entendi.

Olha, esta muito estranho esse problema seu. O que posso dizer, eh que no meus testes, erros ocorreram quando mantive as declaracoes de import nos JSPs. Tirei, e o breakpoint bateu direitinho do MBean.

Vejo que sua JSP nao possui nenhum input vinculado com tipo que poderia ocorrer erro de conversao.

Existe algum campo que voce esteja tentando vincular para os campos inicio e fim do seu MBean? Nao vi na sua pagina, mas nao custa perguntar. Pois se tivesse, vc necessitaria de utilizar as tags <f:convertDateTime />, pois senao um erro de conversao poderia ocorrer, o que justificaria este comportamento que esta tendo.

Bom, infelizmente nao posso te ajudar muito com esse problema. Tudo parece ok pra mim, inclusive no meu ambiente rodou direitinho. Vc tentou abrir o projeto que mandei e testa-lo? Qual foi o comportamento?

Tenta simular este erro num projeto a parte e mande-o pra mim pra rodar aqui. Dessa forma, fica muito mais facil ver o erro.

[quote=alexmdo]Entendi.

Olha, esta muito estranho esse problema seu. O que posso dizer, eh que no meus testes, erros ocorreram quando mantive as declaracoes de import nos JSPs. Tirei, e o breakpoint bateu direitinho do MBean.

Vejo que sua JSP nao possui nenhum input vinculado com tipo que poderia ocorrer erro de conversao.

Existe algum campo que voce esteja tentando vincular para os campos inicio e fim do seu MBean? Nao vi na sua pagina, mas nao custa perguntar. Pois se tivesse, vc necessitaria de utilizar as tags <f:convertDateTime />, pois senao um erro de conversao poderia ocorrer, o que justificaria este comportamento que esta tendo.

Bom, infelizmente nao posso te ajudar muito com esse problema. Tudo parece ok pra mim, inclusive no meu ambiente rodou direitinho. Vc tentou abrir o projeto que mandei e testa-lo? Qual foi o comportamento?

Tenta simular este erro num projeto a parte e mande-o pra mim pra rodar aqui. Dessa forma, fica muito mais facil ver o erro.[/quote]

Os campos inicio e fim não tem campos vinculados, só os 3 da jsp mesmo.
Em um outro forum o pessoal indicou o uso do atributo immediate=“true” no botão, e de fato funcionou, só que por conta disso os campos não estão sendo transferidos para o bean. Não sei se isso te ajuda em alguma coisa.
Eu tentei rodar o seu projeto e funcionou…tentei criar um projeto novo a parte tambem e funcionou de novo. Só dentro do meu projeto que não está funcionando.

Veja… vc tem que tomar muito cuidado com esse atributo Immediate. Utilize-o somente se necessario, pois o mesmo faz com que a fase da validacao e conversao se nao me engano seja ignorada, podendo trazer comportamentos nao desejados na sua aplicacao.

Utilize-o por exemplo, quando voce quiser invocar uma action em seu MBean sem se importar com o conteudo do seu formulario. Por exemplo, de repente vc quisesse criar um bota de voltar na sua pagina. Voce nao iria querer por exemplo, que os valores do seu formulario fosse validado podendo lancar erros na tela do usuario, como o campo X eh obrigatorio por exemplo. Nao sei se ficou claro…

De qualquer forma, acredtio que o Imediate nao traria este tipo de comportamento que esta enfrentando

[quote=alexmdo]Veja… vc tem que tomar muito cuidado com esse atributo Immediate. Utilize-o somente se necessario, pois o mesmo faz com que a fase da validacao e conversao se nao me engano seja ignorada, podendo trazer comportamentos nao desejados na sua aplicacao.

Utilize-o por exemplo, quando voce quiser invocar uma action em seu MBean sem se importar com o conteudo do seu formulario. Por exemplo, de repente vc quisesse criar um bota de voltar na sua pagina. Voce nao iria querer por exemplo, que os valores do seu formulario fosse validado podendo lancar erros na tela do usuario, como o campo X eh obrigatorio por exemplo. Nao sei se ficou claro…

De qualquer forma, acredtio que o Imediate nao traria este tipo de comportamento que esta enfrentando[/quote]

É isso mesmo que está acontecendo…
Sem o immediate fica dando aquele problema de não fazer nada.
Com o immediate o botão aciona o metodo do bean, só que por não vaildar o formulario ele não repassa os valores dos campos para a classe.
Eu achei que o fato de ele funcionar com o Immediate poderia dar alguma dica do que pode estar ocorrendo.