Links com <h:commandLink>

4 respostas
Z

Pessoal estou aprendendo JSF e gostaria de criar uma pagina com links dinamicos.
Por enquanto esta estatico mesmo …

o problema é que consigo pegar o ID do link mas não consigo redirecionar para a pagina espefica.

a pagina é simples só contem:

<f:view>
<h:form>
	<h:commandLink  id="selecaoCursos" actionListener="#{link.mudarPagina}">
			<h:outputText id="Page1" value="Seleção Cursos"/>											  						  
	</h:commandLink>
	<h:commandLink  id="selecaoProfessores" actionListener="#{link.mudarPagina}">
			<h:outputText id="Page2" value="Seleção Professores"/>											  						  
	</h:commandLink>
		<h:commandLink  id="selecaoAlunos" actionListener="#{link.mudarPagina}">
			<h:outputText id="Page3" value="Seleção Alunos"/>											  						  
	</h:commandLink>
</h:form>
</f:view>

o metodo que eu utilizo é o seguinte:

public String mudarPagina(ActionEvent event){
		   String current = event.getComponent().getId();
		   System.out.println("Current-->" + current);		   
		   return current;
	   }

o faces-config

<managed-bean>
		<managed-bean-name>
		link</managed-bean-name>
		<managed-bean-class>
		Controle.Link</managed-bean-class>
		<managed-bean-scope>
		request</managed-bean-scope>
	</managed-bean>	
	<navigation-rule>
		<display-name>
		link</display-name>
		<from-view-id>
		/link.jsp</from-view-id>
		<navigation-case>
			<from-action>#{link.mudarPagina}</from-action>
			<from-outcome>selecaoCursos</from-outcome>
			<to-view-id>
			/selecaoCursos.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<display-name>
		link</display-name>
		<from-view-id>
		/link.jsp</from-view-id>
		<navigation-case>
			<from-action>
			#{link.mudarPagina}</from-action>
			<from-outcome>
			selecaoAlunos</from-outcome>
			<to-view-id>
			/SelecaoAlunos.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<display-name>
		link</display-name>
		<from-view-id>
		/link.jsp</from-view-id>
		<navigation-case>
			<from-action>
			#{link.mudarPagina}</from-action>
			<from-outcome>
			selecaoProfessores</from-outcome>
			<to-view-id>
			/selecaoProfessores.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>

Procurei na internet mas não achei nada substancial! ou alguma boa explicação de como fazer isso ou o porque não redireciona.

Se alguem puder ajudar!
Desde já valeu a ajuda!

4 Respostas

rafael.espiritosanto
O que acontece é que você está usando um actionListener para obter a saída desejada pra poder

avaliar no faces-config. Isso não vai funcionar a menos que você através de código java (jsf)

manipule o navigation-handler dentro do método

(O tipo de retorno de actionListener é void)

Pra poder dar certo você tem que usar o action="${link.mudarPagina}"

Vou procurar fazer um código que faz com que as regras de navegação sejam avaliadas
dentro de um actionListener e mando.

Abraço!

rafael.espiritosanto

Cara, acho que isso funciona (não testei mas deve ser algo do tipo)

public void mudarPagina(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		Application application = context.getApplication();
		NavigationHandler handler = application.getNavigationHandler();
		handler.handleNavigation(context, "#{link.mudarPagina}", "sucesso");
	}

Os objetos FacesContext e Application são objetos importantíssimos do JSF, com eles
você consegue lidar com todas as funcionalidades do JSF.
O NavigationHandler é quem vai se engarregar de verificar a saída no faces-config

Procura na api a assinatura pra você entender melhor.
Os parâmetros do método handleNavigation são
1 - FacesContext - Simples de entender
2 - String fromAction - Imagina o seguinte. Você não sempre usa uma string
como parâmetro pra decidir pra que página ir? Imagina que dois métodos retornem
a mesma string. Como saber qual dos dois métodos foi o responsável? dai você
pode especificar o fromAction e dizer que só muda de página se a string vier de tal método
3 - String outcome - A string que você vai usar pra mudar de página

Espero ter ajudado!
Abraço!

Z

funciono!
valeu a ajuda!

rafael.espiritosanto

Mas qual dos dois? usando actionListener ou somente action?
É que eu nunca usei com actionListener… Foi meio que na base do chute!

Abraço!

Criado 10 de dezembro de 2007
Ultima resposta 13 de dez. de 2007
Respostas 4
Participantes 2