Facelets e primefaces, redirect

9 respostas
M

Pessoal,

Estou iniciando um projeto utilizando o facelets e primefaces e preciso de uma força de vocês, é o seguinte: Criei meu modelo de template (Menu, Topo, Conteúdo) Criei minha pagina de Login e no meu ManagedBean, após autenticação direciono o usuário para a pagina inicial, assim:
public void logar(ActionEvent actionEvent) {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesMessage msg;
        boolean loggedIn;
        Usuario usuario = autenticacao.validaLogin(login, senha);

        if (usuario != null) {
            loggedIn = true;
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bem Vindo", usuario.getIdPessoa().getNome());
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml"); // <--- AQUI
            } catch (IOException ex) {
                Logger.getLogger(LoginBean.class.getName()).log(Level.SEVERE, null, ex);
            }

        } else {
            loggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro Login", "Credenciais invalidas");
        }

        FacesContext.getCurrentInstance().addMessage(null, msg);
        context.addCallbackParam(
                "loggedIn", loggedIn);
    };
O problema é que quando é carregada minha página, os componentes do template (Topo e Menu) não são renderizados. Fiz um teste, colocando na chamada do método de Login 'Ajax="false"' e funcionou, assim:
<p:commandButton value="Login" update="growl"   
                                         actionListener="#{loginBean.logar}" 
                                         ajax="false"
                                         oncomplete="handleLoginRequest(xhr, status, args)"/>

porém acho que essa não é a solução pois depois de declarar "ajax="false" estou tendo problemas com meus JScripts.

Alguém tem alguma sugestão?
Dei uma procurada na web e não encontrei algo que me ajude.
Como faço esse redirecionamento?

9 Respostas

J

Amigo tente usar o sendRedirect("./index.jsf") uma vez que vc tenha configurado no seu web.xml o sufixo para renderização dos XHTML como *.jsf.
Tente algo assim:

HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.sendRedirect("./index.jsf");
F

Com o send redirect vc vai fazer 2 requizições não acho o mais apropriado para o caso, não vi o código todo mais acho que ta faltando uma regra ne navegação, e vc retornar uma string no método logar com essa regra de navegação.

J

+1

Quanto ao problema dele pode ter ocorrido isso devido a ele ta redirecionando para uma páginas com o suffix .xhtml sendo assim acredito que a Servlet do JSF não
processara essa páginas para montar a árvore de componente dela e assim não renderizando a mesma de forma correta.
Marcio N Carvalho o seu mapeamento servlet-mapping no web.xml esta mapeado pra qual extenção?
Caso seja *.jsf

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;

Altere seu código e deixe assim:

try {  
         FacesContext.getCurrentInstance().getExternalContext().redirect("./index.jsf"); // &lt;--- AQUI  
       } catch (IOException ex) {  
          Logger.getLogger(LoginBean.class.getName()).log(Level.SEVERE, null, ex);  
       }
F

Caro jweibe o redirect é uma opção para quando vc quer sair da sua aplicação, e vc quer fazer o browser trabalhar, ou seja vc manda um resquisição para o servidor e ele manda uma resposta para o browser com um head de location que diz para o browser fazer um novo request assim estará fazendo dois resquests para o mesmo servidor sendo que o mais certo nesse caso é vc fazer um request e ele enviar um response.

H

Concordo com o Flavio machine.

Verifique se o suffix *.xhtml está mapeado em seu web.xml.

Verifique também se no seu template está declarado <h:head> <h:body> e não apenas <head> <body>.

M

Galera,

Valeu mesmo pelas dicas, estou no trabalho agora mais assim que chegar em casa vou seguir as orientações.

Obrigado.

M

Flavio,

Quando fala sobre regra de navegação retornando “Strring” está se referindo ao Facesconfig?

M

Criei a regra de Navegação, tanto pelo faces-config quanto direto no retorno do método e não rolou.
no site do primefaces http://www.primefaces.org/faq.html diz que commandlink e commandbutton não suportam navegação.

“PrimeFaces does not support forward based navigations within an ajax request, you need to do redirect instead or set ajax to false.”

Diz que é necessário usar o redirect ou ajax = false.

Confesso que agora fiquei preocupado, já que redirect não é a solução apropriada.

Alguem tem alguma ideia de qual é a melhor saída?

H

Melhor saída? ou ajax=false ou utilizar h:commandButton

Criado 30 de janeiro de 2012
Ultima resposta 31 de jan. de 2012
Respostas 9
Participantes 4