Boa tarde!
Estou tendo problemas ao mudar de página pelo JSF, a página muda mas o método da outra página não é executado:
Código do link:
Código do método que redireciona:
Tentei 3 soluções que achei pela internet:
Primeira:
FacesContext faces = FacesContext.getCurrentInstance();
ExternalContext context = faces.getExternalContext();
context.redirect("cadastrar_usuario.xhtml?faces-redirect=true");
Segunda:
Terceira:
Método que não é invocado:
<h:commandButton value="Cadastrar usuário"
action="#{usuarioBean.cadastrarUsuario}" />
Da segunda forma a página é redirecionada, porém o link na barra do navegador continua com o mesmo link e os métodos da página cadastrar_usuario não são invocados.
Então resumindo o problema, ao redirecionar a página os métodos JSF não funcionam.
Desde já agradeço.
Bom dia,
Você pode criar uma regra de navegação no faces-config.xml conforme abaixo:
<navigation-rule>
<navigation-case>
<from-outcome>paginaCadastrarUsuario</from-outcome>
<to-view-id>/cadastrar_usuario.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
No commandLink você pode por assim:
<h:commandLink action="paginaCadastrarUsuario" immediate="true" value="Cadastre-se!" />
Obs: o immediate=“true” é para que não seja realizada a validação dos campos na sua página, dessa forma o fluxo do JSF é alterado para que não seja executada a fase de validação. Como é apenas uma navegação, acredito que os campos que você possui na tela não precisam ser validados no caso do redirecionamento, correto?
Em relação ao método que não está sendo chamado, já tentou verificar se não ocorreu algum erro na fase de conversão/validação do JSF? Você pode utilizar um PhaseListener para verificar. Caso ache interessante, segue um exemplo de PhaseListener:
package br.com.guj.filters;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
public class DebugPhaseListener implements PhaseListener {
private static final long serialVersionUID = 1L;
@Override
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
//Obtem o nome da view atual.
String view = facesContext.getViewRoot().getViewId();
System.out.println(view + "depois da fase de " + event.getPhaseId().toString());
}
@Override
public void beforePhase(PhaseEvent event) { }
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}