Redirecionamento Primefaces + JSF

Tenho uma tela de login que fiz usando primefaces e suas requisições ajax, tá tudo funcionando beleza os managedbeans, etc… Inclusive está retornando o resultado de sucesso do método login via ajax pra um dialog, tudo belezinha etc… Só queria saber como faço pra ser redirecionado pra outra página no caso de sucesso? Tenho que configurar alguma coisa no faces-config.xml? Posso fazer o redirecionamento no próprio managedbean? Se sim, como faria isso?

Desde já obrigado pela a atenção. :slight_smile:

adiciona no seu managedbean o seguinte código junto do caso de sucesso:

FacesContext.getCurrentInstance().getExternalContext().redirect("suapagina.extensao");

No caso você poderia fazer requisição não ajax. Daí você colocaria no p:commandButton a propriedade ajax=“false” e action="#{action aqui}". No método chamado na action você retorna uma string contendo a página para redirecionamento, colocando um:

public String metodo() {
  if (sucesso) {
    return "/pagina"; // Coloca a página sem sua extensão, lembrando que o barra entra no diretório webcontent, ou seja a url seria: localhost:8080/projeto/pagina.extensaodefinidanoxml
  } else {
    return ""; // Fica na página atual
  }
}

Agora caso precise ser via ajax, pode fazer como o amigo acima falou.

Só tenha em mente que ao fazer o redirect os dados do request original serão perdidos. [=

Você terá que gravá-los em sessão.

Muito obrigado a todos pelas dicas, obrigado mesmo.

Só gostaria que vocês me respondesem um dúvida pra terminar…

Seria mais elegante usar ajax no login? Conforme o andre.foes e o esdras_63 disseram, tanto por uma técnica como por outra eu não preciso adicionar nada de regras de navegação no faces-config.xml certo? Conforme o jakefrog disse, eu estou armazenando um usuário no managedbean com o escopo de sessão, então minha instância continuará, certo ou não?

Se é sessão sim, continua até que a sessão morra ou que você remova os objetos da sessão.

Quanto a elegância, Ajax não é muito utilizado nesse caso não. Costuma-se utilizar uma navegação simples.

jakefrog, acho que vou deixar ajax mesmo porque gostei mais do resultado. Você me disse que a instância continuaria no managed bean, tentei fazer um teste agora e não obtive sucesso…

@ManagedBean(name = "loginManagedBean")
@SessionScoped
public class LoginManagedBean implements Serializable {

    static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(LoginManagedBean.class);
    private String usuario;
    private String senha;
    private PessoaServiceInterface serviceInterface;
    private Pessoa pessoa;

    /**
     * Cria uma nova instância de LoginManagedBean
     */
    public LoginManagedBean() {
        this.serviceInterface = new PessoaService();
        BasicConfigurator.configure();
        logger.setLevel(org.apache.log4j.Level.DEBUG);
    }

    /**
     * Executa o login do usuário, verificando a existência de login e senha.
     *
     * @param actionEvent
     */
    public void login(ActionEvent actionEvent) {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesMessage msg = null;
        boolean loggedIn = false;
        try {
            //Verifica retorna a pessoa com usuário e senha passados.
            Pessoa p = serviceInterface.buscarPorLoginESenha(usuario, senha);
            if (p != null) {
                //faz a verificaçao.
                System.out.println(p);
                loggedIn = true;
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Sessão iniciada", "Bem-vindo, " + p.getNome() + ".");
            } else {
                //lança exceção.
                System.out.println(p);
                loggedIn = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login inválido", "Verifique seu nome de usuário e senha.");
            }
        } catch (PessoaException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_FATAL, "PessoaException", ex.getMessage());
            Logger.getLogger(LoginManagedBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Erro de Conexão", e.getMessage());
        }
        //Adiciona mensagem a ser exibida na view.
        FacesContext.getCurrentInstance().addMessage(null, msg);
        //Se logado, redireciona.
        if (loggedIn) {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect(
                        FacesContext.getCurrentInstance().
                        getExternalContext().getRequestContextPath() + "/pages/sistema.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(LoginManagedBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
        }
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
}

Veja que ele redireciona para o /pages/sistema.xhtml, só que em sistema eu tento acessar o usuário e ele não retorna nada…

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <body>

        <ui:composition template="./../templates/index_template.xhtml">

            <ui:define name="cabecalho">
                cabecalho
            </ui:define>

            <ui:define name="corpo">
                corpo
                <h:outputText value="#{loginManagedBean.pessoa.nome}"/>
            </ui:define>

            <ui:define name="rodape">
                rodape
            </ui:define>

        </ui:composition>

    </body>
</html>

O que será que pode estar acontecendo?

esse caminho tá corrento? ./…/templates/index_template.xhtml ?

Jakefrog, com certeza deve ser o template mesmo, estou aqui tentando e não consigo pegar o path pra o template… Já tentei até passar o path completo por “#{facesContext.externalContext.requestContextPath}/templates/index_template.xhtml” e nada…

Como você pode ver, o login tá na página index que redireciona para a página /pages/sistema.xhtml que usa o template que está em /templates/index_template.xhtml…

Alguma idéia??

Muit obrigado mesmo… :slight_smile:

Já tentou adicionar o template chamando a raiz do teu sistema?
Tenta assim:

template="/InTouchMaven/templates/index_template.xhtml"

andre.froes, tentei também e nada!

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:p="http://primefaces.org/ui"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                template="/InTouchMaven/templates/index_template.xhtml">

    <ui:define name="cabecalho">
        cabecalho
    </ui:define>

    <ui:define name="corpo">
        corpo
        <img src="/InTouchMaven/resources/imagens/error/Internet-Document-icon.png" id="icone-logo"/>
        <h:outputText value="#{loginManagedBean.pessoa.nome}"/>
        <p:spinner/>
    </ui:define>

    <ui:define name="rodape">
        rodape
    </ui:define>

</ui:composition>

Sinceramente, não tenho a mínima idéia do que seja isso… não tá pegando o template de jeito nenhum…

seu documento .xhtml não deveria esta assim <h:head><h:body> etc…