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?
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:
Agora caso precise ser via ajax, pode fazer como o amigo acima falou.
H
Hebert_Coelho
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.
V
Vin_ius_Abreu_de_Fra
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?
H
Hebert_Coelho
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.
V
Vin_ius_Abreu_de_Fra
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")@SessionScopedpublicclassLoginManagedBeanimplementsSerializable{staticorg.apache.log4j.Loggerlogger=org.apache.log4j.Logger.getLogger(LoginManagedBean.class);privateStringusuario;privateStringsenha;privatePessoaServiceInterfaceserviceInterface;privatePessoapessoa;/** * Cria uma nova instância de LoginManagedBean */publicLoginManagedBean(){this.serviceInterface=newPessoaService();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 */publicvoidlogin(ActionEventactionEvent){RequestContextcontext=RequestContext.getCurrentInstance();FacesMessagemsg=null;booleanloggedIn=false;try{//Verifica retorna a pessoa com usuário e senha passados.Pessoap=serviceInterface.buscarPorLoginESenha(usuario,senha);if(p!=null){//faz a verificaçao.System.out.println(p);loggedIn=true;msg=newFacesMessage(FacesMessage.SEVERITY_INFO,"Sessão iniciada","Bem-vindo, "+p.getNome()+".");}else{//lança exceção.System.out.println(p);loggedIn=false;msg=newFacesMessage(FacesMessage.SEVERITY_WARN,"Login inválido","Verifique seu nome de usuário e senha.");}}catch(PessoaExceptionex){msg=newFacesMessage(FacesMessage.SEVERITY_FATAL,"PessoaException",ex.getMessage());Logger.getLogger(LoginManagedBean.class.getName()).log(Level.SEVERE,null,ex);}catch(Exceptione){msg=newFacesMessage(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(IOExceptionex){Logger.getLogger(LoginManagedBean.class.getName()).log(Level.SEVERE,null,ex);}}else{}}publicStringgetSenha(){returnsenha;}publicvoidsetSenha(Stringsenha){this.senha=senha;}publicStringgetUsuario(){returnusuario;}publicvoidsetUsuario(Stringusuario){this.usuario=usuario;}publicPessoagetPessoa(){returnpessoa;}publicvoidsetPessoa(Pessoapessoa){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"><htmlxmlns="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:compositiontemplate="./../templates/index_template.xhtml"><ui:definename="cabecalho">
cabecalho
</ui:define><ui:definename="corpo">
corpo
<h:outputTextvalue="#{loginManagedBean.pessoa.nome}"/></ui:define><ui:definename="rodape">
rodape
</ui:define></ui:composition></body></html>
O que será que pode estar acontecendo?
H
Hebert_Coelho
esse caminho tá corrento? ./…/templates/index_template.xhtml ?
V
Vin_ius_Abreu_de_Fra
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…
A
andre.froes
Já tentou adicionar o template chamando a raiz do teu sistema?
Tenta assim: