JSF - <h:commandButton nem sequer chama método que está no action ao ser pressionado

20 respostas
N

Olá Srs.

Em cada linha da minha dataTable tenho um botão a qual deletará a respectiva linha. Pois bem, o fato é que quando o botão é pressionado NÃO CHAMA O MÉTODO DE DELEÇÃO. Tenho outra página que é identica a essa (exceto por uns hiddens a mais para serem usados nos request’s) e ela funciona perfeitamente… inclusive é de praxe eu utilizar o seguinte trecho de código para executar deleções dentro de uma dataTable:

&lt;h:commandButton value="minhaVar.idMeuBean" action="MeuBean.excluir" image="bla/bla/bla.jpg" /&gt;

Acho que o <t:saveState não seria adequado para essa funcionalidade tão trivial…

Alguém teve algum problema similar??

[]'s
>

20 Respostas

L

Pergunta básica: Eles estão dentro de um h:form?

N

Sim, estão dentro de um <h:form. Mas aproveitando que disse isso, quais os problemas que a ausência do mesmo pode causar?? Ainda não conheço muito de JSF…

[]'s>

H

Posso estar enganado, mas acho que deveria ser assim:

&lt;h:commandButton value="#{minhaVar.idMeuBean}" action="#{MeuBean.excluir}" image="bla/bla/bla.jpg" /&gt;

Espero ter ajudado.

N

Desculpa… eu esqueci de colocar a EL… mais é exatamente assim que está!! Bem lembrado!

[]'s

N

Eu só queria saber o que pode ocasionar isso… depois eu me viro!! Só que não tenho idéia do pq não executa o método… NUNCA VI ISSO ANTES!!

[]'s

I

No seu MB você está importando o ActionEvent do faces ou do awt ?

Já tivemos problemas assim, o netbeans importando automaticamente o ActionEvent do awt sem que tenhamos percebido, aí não funfa mesmo…

Esperto ter ajudado…

Até +

N

Do Faces mesmo!
Tentei dessa forma passando um Integer para o método e nem sequer executou.

&lt;t:commandButton value="Deletar" action="goDeleteView" onclick="return confirm('Deseja realmente excluir?')" &gt;
                                                    &lt;t:updateActionListener value="#{minhaVar.id}" property="#{meuBean.excluir}" /&gt;
                                                &lt;/t:commandButton&gt;

Ele vai para a mesma página através da String do action “goDeleteView” (é um refresh) só que a dataTable vazia, tendo em vista que o método não é executado!!

Poxa vida… será um bug do jsf?

[]'s

I

Mais um detalhe… ele está seguindo a estrutura abaixo né ?

&lt;f:view&gt;
&lt;h:form&gt;
...Aqui seus comandos
&lt;/h:form&gt;
&lt;/f:view&gt;

Estranho, nunca vi isso… tem que funcionar !!!

M

Por que não tenta postar o código inteiro da página ou pelo menos um pouco mais?
Podem ser vários problemas, desde uma incompatibilidade de um simples h:form, f:view, por causa de id, pela quantidade ou por ausência de algum deles (respondendo sua pergunta: sem o h:form não há como submeter os dados). Também pode ser uma declaração de taglib faltando.

Assim como você tentou com “t:”, pode tentar assim:

<h:commandButton action="#{meuBean.excluir}" value="Excluir">
   <f:setPropertyActionListener value="#{variavel}" target="#{localParaSetarVariavel}" />
</h:commandButton>
W

Eu faço sempre desta forma:

Na página jsf coloque:

<h:column width=“2%” textAlign=“center”>
<h:commandLink immediate=“true” actionListener="#{manageBean.excluir}">
<ef:graphicImage url=“endereco imagem” style=“border:0px;” />
</ef:commandLink>
</ef:column>

No Manage Bean coloque:

public void excluirAreaDeVenda(ActionEvent evt) {

Objeto objeto = (Objeto) getTable().getRowData();

try {

getListagem().remove(objeto);

} catch (PersistenceException e) {

FacesUtil.msgError(“Erro ao excluir.”);

e.printStackTrace();

}

}

Onde o table é o nome do binding da tabela e o listagem é o valor do value da sua tabela.

Espero ter ajudado

N

mrbbm:
Por que não tenta postar o código inteiro da página ou pelo menos um pouco mais?
Podem ser vários problemas, desde uma incompatibilidade de um simples h:form, f:view, por causa de id, pela quantidade ou por ausência de algum deles (respondendo sua pergunta: sem o h:form não há como submeter os dados). Também pode ser uma declaração de taglib faltando.

Assim como você tentou com “t:”, pode tentar assim:

<h:commandButton action="#{meuBean.excluir}" value="Excluir"> <f:setPropertyActionListener value="#{variavel}" target="#{localParaSetarVariavel}" /> </h:commandButton>

Tentei assim tb…mas sem sucesso!
Posto o código sim, sem problemas…mas antes… será que é erro de :

“desde uma incompatibilidade de um simples h:form, f:view, por causa de id, pela quantidade ou por ausência de algum deles”

Pq se fosse isso, mt provavelmente não funcionaria com o escopo na session tb não é?
Pq se eu apenas mudar o escopo para session FUNCIONA…só que NÃO ROLA escopo de bean na session aqui na empresa!!
Ouvi dizer que JSF tem bug’s desse estilo. Imaginem que se eu tirar o botão de dentro da dataTable e INGESSAR um id para teste ele tb chama o método.
Engraçado não? :smiley:

[]'s

B

Tente colocar um submit javascript no evento de onclick:

<h:commandButton value="minhaVar.idMeuBean" action="MeuBean.excluir" image="bla/bla/bla.jpg" onclick="document.forms[0].submit();" />

Outra coisa… eu já tive EXATAMENTE esse problema, por que o cliente estava usando o internet explorer 6, e eu havia testado a tela no internet explorer 7.

N

Srs.
Chutei o balde e coloquei o escopo do bean na session!! Se alguém eventualmente teve uma experiência assim e quizer ajudar…posta aí!!

[]'s

L
Cara vc ta usando um metodo :

public void excluirAreaDeVenda(ActionEvent evt) { }

para estes tipos de metodo deve se usar actionListener=#{seuBean.metodo} e naum action=#{seuBean.metodo}

Caso queira usar action tem que ser um metodo que retorne uma String tipo:

public String excluirAreaDeVenda() {

//faz alguma coisa

return “”;
}

:wink:

L

Tenta colocar a anotação @KeepAlive na sua classe…

V

Cara, usa o keep alive, assim o bean “sobrevive” além do request, mas não precisa alterar o escopo.

J

Pessoal… Estou com o mesmo erro. <h:commandButton nem sequer chama método que está no action ao ser pressionado" >

Minha pagina XHTML

..
<f:view>
<h:body>	
 <h:commandLink action="#{recuperaAcessoMB.recuperarAcessoRedirect}" value="#{msg['label.esqueci.senha']}" />
</h:body>	
</f:view>
..

Meu MB

@ManagedBean (name="recuperaAcessoMB")
@SessionScoped
public class RecuperaAcessoMB implements Serializable {

		
	public String recuperarAcessoRedirect(){			
		
		return "/pages/recuperarAcesso?faces-redirect=true";	
	}

O erro

HTTP Status 404 - null not found

Estou usando PrimeFaces…
Alguem tem ideia?
Vlw

M

Mesma coisa aqui… o <h:commandButton> não acessa meu Bean.

&lt;ui:define name="divContentHeader"&gt; &lt;h:outputLabel value="#{msgTurnos.lblTurnos}" /&gt; &lt;h:commandButton immediate="true" value="Salvar" actionListener="#{mBeanManterTurnos.salvar}"/&gt; &lt;/ui:define&gt;

X

Cara eu passei por esse problema. Resolvi do seguinte jeito:

Primeiro tenha certeza se é um erro de validation:

coloque na sua pagina a seguinte tag:
<h:messages/>

se for erro de validacao: faça o seguinte, use converter para suas combos(selectOneMenu), e importante, seus Objetos que vao nas combos devem ter hashcode e equals para que passem na Validation Phase.

Esse erro ocorre porque o tipo de dado que vem da pagina é diferente do esperado no backing bean.
E se for esse o caso, acaba que nao chama o action do seu form.

Espero ter ajudado.

M

não vou conseguir ver se era isso mesmo porque eu resolvi atualizando as lib, de tudo que eu usava.

Criado 9 de maio de 2010
Ultima resposta 27 de nov. de 2011
Respostas 20
Participantes 13