Olá a todos.
Estou fazendo um CRUD simples.
Uso JSF 2.1, Primefaces 3.3.1.
E me deparei com um problema e uma dúvida.
na minha página index.xhtml, onde são listados todos registros tenho um botão para outra página que está desta forma:
após o clique ele exibe a página para inserir, onde tem dois botões:
<p:commandButton value="Salvar" action="#{clienteBean.inserir}"/>
<p:commandButton value="Cancelar" action="index"/>
se eu clico no Salvar ele executa o método inserir do bean cliente, e ao final do método tem:
se clico no botão cancelar, ele simplesmente volta para a index.xhtml. Até ai tudo bem.
O problema é que em ambos os casos, quando volta pra index.xhtml, ao clicar em qualquer botão, ele não faz nada, ao clicar pela segunda vez ele executa o comando desejado.
Depois de debugar o método construtor do bean, percebi que no primeiro clique ele é simplesmente instanciado, mas não chama o método desejado, na segunda vez ele instacia novamente e chama o método desejado.
O meu bean é request scoped.
Durante um dos testes, coloquei pra não fazer o forward, e sim o redirect, desta forma:
//no botao da pagina inserir.xhtml
<p:commandButton value="Cancelar" action="index?faces-redirect=true"/>
//no retorno do método de inserir
return "index?faces-redirect=true";
No caso do botão cancelar, também conseguir resolver de outra forma, colocando o atributo: ajax=“false”.
Com esse atributo, ao voltar para a index.xhtml, no primeiro clique ele executa o método, porém, ao voltar para a index.xhtml, ele muda a url.
Exemplo:
Estou em "cliente/index.xhtml"
clico no botão "Novo cliente"
A url permanece "cliente/index.xhtml"
Clico em "Cancelar"
a url muda para “cliente/inserir.xhtml”
Gostaria de ajuda para entender o motivo destes comportamentos, suas possíveis soluções.
Obrigado.