Refresh de pagina em JSF

24 respostas
A

Boa Tarde a todos,
Bom eu estou com um problema aqui q para muitas de voces pode parecer besta, começei a estudar um pouco de JSF e fui fazer uns sisteminha basico aqui, fiz um sistema de login e senha para controle de programas, quando a pessoa faz o login ele é redireciona para uma lista de link’s (que são outras pagina xhtml) quando a pessoa clica em um link ela é redirecionada para a respectiva pagina, so que o problema é que quando eu clico no lnk ele muda a ural mais não muda o corpo da pagina, talvez seja algo relaciona com o ciclo de vida do JSF, não sei, mais se alguem souber como que:
Quando a pessoa clica no link, é aberto a pagina que a pessoa quer e não mudar a url apenas, antes que eu me esqueça o link ta assim:

<h:outputLink rel="band.xhtml" target="_blank" value="band.xhtml" >
			<h:outputText value="Band"/>
</h:outputLink>

Tambem tentei com o link HTML normal:

<a href="/Controle/band.xhtml" target="_blank" >Band</a><br/>

Mais deu a mesma coisa, quam souber e quiser ajudar eu agradeço.

24 Respostas

R

ja tentou fazer sem a propriedade target setada como blank?

K

Jovem,

Creio que você não está a utilizando o faces navigation. Dar uma olhada neste link http://www.jsftutorials.net/jsf-navigation-by-examples.html

Abs,

A

Sim, e mesmo porque eu acho q isso não faria diferença neh, pq ai ela so vai abrir mais uma pagina no browser.

R

é que não pensei no faces navigation hehe… desculpa!

valeu Kanin Dragon!

A

Kanin Dragon
Obrigado pelo link, mais eu dei uma lida no link tentei fazer a configuração e mesmo assim não rolou.

ficou assim, faces-config:
<navigation-rule>
		<from-view-id>/Controle/mainpage.xhtml</from-view-id>
		<navigation-case>
			<from-outcome>band</from-outcome>
			<to-view-id>/band.xhtml</to-view-id>
		</navigation-case>
e o link:
<h:commandButton action="band" value="Band"/>
	
	<br/>

teria como vc me dizer se eu errei em algo?

K

Jovem,

Aparentemente está correto, mas post o faces-config.xml.

Abs,

A
<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

	<lifecycle>
		<phase-listener>br.com.steno.phase.CicloDeVida</phase-listener>
	</lifecycle>
	<lifecycle>
		<phase-listener>br.com.steno.phase.LoginPhaseListener</phase-listener>
	</lifecycle>
	<navigation-rule>  
        <from-view-id>/Controle/mainpage.xhtml</from-view-id>  
        <navigation-case>  
            <from-outcome>band</from-outcome>  
            <to-view-id>/band.xhtml</to-view-id>  
        </navigation-case>
     </navigation-rule>
</faces-config>
K

Jovem,

<to-view-id>/band.xhtml</to-view-id>

O seu arquivo band.xhtml está na raiz do WebContent ?

Abs,

A

Sim

e esta linha:

<from-view-id>/Controle/mainpage.xhtml</from-view-id>

eu ja mudei para

<from-view-id>/mainpage.xhtml</from-view-id>
K

Jovem,

Ocorre algum erro quando clica no commandButton?

Abs,

A

Não, ele simplismente não joga para a pagina, eu clico no botão e ele não me responde nada,
no console eu recebo a mensagem:

Depois de: RESTORE_VIEW 1 Depois de: RESTORE_VIEW 1 Depois de: APPLY_REQUEST_VALUES 2 Depois de: APPLY_REQUEST_VALUES 2 Depois de: PROCESS_VALIDATIONS 3 Depois de: PROCESS_VALIDATIONS 3 Depois de: UPDATE_MODEL_VALUES 4 Depois de: UPDATE_MODEL_VALUES 4 Depois de: INVOKE_APPLICATION 5 Depois de: INVOKE_APPLICATION 5 Depois de: RENDER_RESPONSE 6 Depois de: RENDER_RESPONSE 6

Que foi um phaselistener q eu coloquei, não sei se isso te ajudaria em algo

K

Jovem,

Creio que seja por isso que não está conseguindo navegar. O seguinte faça o teste isolado sem o phase-listener.

abs,

A

Puts era isso mesmo,
mais ai eu caio em um problema na linha:

<lifecycle> <phase-listener>br.com.steno.phase.LoginPhaseListener</phase-listener> </lifecycle>

Eu uso um Phaselistener para realizar o login, e se eu retiro essa linha ele não fica declarado, ou seja, meu login não funciona, existe outra maneira de declarar o phase?

K

Jovem,

Esta achando muito estranho rsrs…

Da uma olha neste link http://rodrigolazoti.com.br/2008/09/01/filtrando-usuarios-logados-em-jsf-com-phaselistener/

Abs,

A

Kanin Dragon

Obrigado pelo link, isso foi mais ou menos oque eu fiz.

Oque eu gostaria de saber é como eu faço para ele redirecionar para a pagina que eu quero apos ele estar logado, pois quando eu logo e clico no botão ele não me deixa navegar, vo postar o codigo todo aqui talvez alguem ache algum erro.

Mainpage.xhtml:
<h:form>
		<h:commandButton value="Band" action="band?faces-redirect=true"/>
</h:form>
Login.xhtml
<h:outputLabel value="Login" for="login"/>
    <h:inputText id="login" value="#{loginBean.usuario.login}"/>
    <br/>

	
	<h:outputLabel value="Senha" for="senha"/>
    <h:inputSecret id="senha" value="#{loginBean.usuario.senha}"/>
    <br/>
   <h:commandButton value="Entrar" action="#{loginBean.efetuaLogin}" />
LoginBean
public String efetuaLogin(){
		UsuarioDAO dao=new UsuarioDAO();
		boolean loginValido=dao.existe(this.usuario);
		if(loginValido==true){
			return "mainpage?faces-redirect=true";
		}else{
			return "login";
		}
	
	}
LoginPhaseListener:
package br.com.steno.phase;

import javax.faces.application.NavigationHandler;
import javax.faces.bean.SessionScoped;
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;

import br.com.steno.mb.LoginBean;

@SessionScoped

public class LoginPhaseListener implements PhaseListener {

	@Override
	public void afterPhase(PhaseEvent event) {
		// TODO Auto-generated method stub
		FacesContext context = event.getFacesContext();
		
		if("/login.xhtml".equals(context.getViewRoot().getViewId())){
			return;
		}
		LoginBean loginBean=context.getApplication().evaluateExpressionGet(context, "#{loginBean}", LoginBean.class);
		
		if(!loginBean.isUsuarioLogado()){
			NavigationHandler handler=context.getApplication().getNavigationHandler();
			handler.handleNavigation(context, null, "login");
			
			context.renderResponse();
		}
		
		
	}

	@Override
	public void beforePhase(PhaseEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public PhaseId getPhaseId() {
		// TODO Auto-generated method stub
		return PhaseId.RESTORE_VIEW;
	}

}

se você ou alguem conseguir indentificar o erro, estou aberto a sugestoes

R

provavelmente isso ja ta feito… mas como nao encontrei em nenhum lugar vou perguntar…

no seu faces-config.xml você tem uma navegação mapeada da login para a mainpage?

A
Nem porque se o usuario for autenticado ele ja joga pro mainpage...
if(loginValido==true){  
        return "mainpage?faces-redirect=true";  
    }else{  
        return "login";  
    }
De qualquerforma meu faces-config:
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

 <lifecycle>
		<phase-listener>br.com.steno.phase.LoginPhaseListener</phase-listener>
</lifecycle>
	
 	<lifecycle>
 		<phase-listener>br.com.steno.phase.CicloDeVida</phase-listener>
 	</lifecycle>
</faces-config>
R

So, with the annotations and the implicit navigation, it is possible to write an application without needing a faces-config.xml, but there are still cases where the configuration file is needed.

For example, localization information such as the default and supported locales, or using any of the advanced features such as ELResolvers, PhaseListeners, or any artifact that can rely on the decorator pattern (such as application factories, Application, RenderKit, etc).

eu li aqui que aparentemente essa técnica de usar o “faces-redirect=true” não funciona se você usa PhaseListeners… então eu tentaria definir as navegações dentro do faces-config… caso não dê certo, valeu a tentativa hehe… o link que eu vi está aqui

http://blogs.oracle.com/rlubke/entry/faces_config_xml_we_don

S

Se entendi bem o problema, quando você navega tá sempre voltando pra pagina de login, é isso?
Me parece que o sistema nao esta mantendo a informacao de que o login foi feito com sucesso. Entao todo clique apos a primeira tela vai voltar pro form de login.

Seria isso?

Dá uma conferida no seu LoginBean, se ele esta SessionScoped e se a logica do isUsuarioLogado está correta.
(PS. alias, o PhaseListener nao precisa da anotacao de escopo)

Abraços

S

Conseguiu resolver o problema?

Abraços

R

Sérgio,

Estou neste mesmo exemplo, porém com um problema diferente. Na linha

LoginBean loginBean =  context.getApplication().evaluateExpressionGet(context, "#{loginBean}", LoginBean.class);

O próprio Eclipse esta apontando erro, dizendo:

The type javax.el.ELException cannot be resolved. It is indirectly referenced from required .class files

Bom, segue o meu código do LoginBean

package br.caelum.notasfiscais.mb;

import java.io.Serializable;

import javassist.expr.NewArray;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.caelum.notasfiscais.DAO.UsuarioDAO;
import br.caelum.notasfiscais.modelo.Usuario;
import br.caelum.notasfiscais.util.T;

@ManagedBean
@SessionScoped
public class LoginBean<T> implements Serializable {


	private Usuario usuario = new Usuario();
	
	public String efetuaLogin(){
		UsuarioDAO dao = new UsuarioDAO();
		boolean loginValido = dao.existe(this.usuario);
		if (loginValido){
			return "produto?faces-redirect=true";
		}
		else{
			this.usuario = new Usuario();
			return "login";
		}
	}

	public Usuario getUsuario() {
		return this.usuario;
	}
	
	public Boolean isUsuarioLogado(){
		return usuario.getLogin() != null;
	}
	
		
}
R

Pessoal,

Só para avisar que já resolvi e era bem simples. Eu não havia marcado em Targeted Runtime (você pode acessá-lo através das propriedades do seu projeto) o meu servidor padrão (Tomcat 7)

P

valeu pela dica rafael tb tava com o mesmo problema no metodo .evaluateExpressionGet(); foi so acessar propriedades do projeto e acessar targeted runtimes e selecionar o servidor… VLW !

P

Valew!!! Estava com o mesmo problema!

Criado 27 de maio de 2011
Ultima resposta 13 de out. de 2011
Respostas 24
Participantes 7