Como redirecionar para uma página especifica ManagedBean?

6 respostas
D

Boa noite a todos.

Desenvolvo uma app JSF, PrimeFaces e Facelets na página principal tenho um Tree (PrimeFaces) que qdo o usuario clicar em um TreeNode o metodo que intercepta esta seleção deverá redirecionar para a pagina correspondente a seleção feita.
Eu estou querendo fazer isso com navegação implicita, ou seja, retornando o nome da página a ser carregada, só que isso não acontece.

Segue o código:

Pagina principal :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui" 
      xmlns:ui="http://java.sun.com/jsf/facelets">
 
      
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title><ui:insert name="titulo">Sistema - Gestão de Obras</ui:insert></title>
	<h:outputStylesheet library="css" name="estilo.css"/> 
	<style type="text/css"><!--
	#logotipo {
		text-align: center;
	} -->
    </style>
</h:head>

<h:body>
 
		<div id="logotipo">
			<h:graphicImage library="imagens" name="books2.jpg" title="Getão de obras" />
			<h:outputLabel>Gestão de obras</h:outputLabel>
		</div>
		
		<div id="corpo">
			<ui:insert name="corpo"/>    
		</div>
		
		<div id="barramenu">
	    	<ui:insert name="barra_menu"> 
	    	    <ui:include src="/restrito/barramenu.xhtml"/>
	   		</ui:insert>   
		</div>
		
		<div id="rodape">
	    	<ui:insert name="rodape">
	    		<ui:include src="/restrito/rodape.xhtml"/>
	    	</ui:insert> 
		</div>  
</h:body>
</html>

Menu :

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

            <h:outputText value="Selecione a opção desejada" style="width:15%; font-family: Verdana; font-size: 10px; font-weight: bold; color: red;"/>
            <h:form>
               
                 <p:tree id="arvore" value="#{menuBean.opcoesMenuTree}" var="node"
                  style="width:20%; font-family: Verdana; font-size: 8px; font-weight: bold; color: green; border-top: thin solid #CCCCCC; border-bottom: thin solid #CCCCCC; border-left: medium solid #CCCCCC; border-right: medium solid #CCCCCC; padding-right:2px; "
                  dynamic="false"
                  selectionMode="single"
                  selection="#{menuBean.selectedNode}"
                  nodeSelectListener="#{menuBean.opMenuSelecionada}">  
                      <p:treeNode>  
                        <h:outputText value="#{node.titleFormulario}" styleClass="treeLink" type="link" />
                      </p:treeNode>
                  </p:tree>  
              
            </h:form>

</ui:composition>
</h:form>
</html>

Managedbean :

@ManagedBean(name="menuBean")
@SessionScoped
public class MenuBean {

	private TreeNode root;
	private TreeNode opcoesMenuTree;
	private TreeNode selectedNode;
	
	public TreeNode getOpcoesMenuTree() {
	   if (this.opcoesMenuTree == null) {
			OpcoesMenuRN opMenuRN = new OpcoesMenuRN();
			List<OpcoesMenu> opMenu = (List<OpcoesMenu>) opMenuRN.localizaOpMenu(1);
		    this.opcoesMenuTree = new DefaultTreeNode( null , null);
		    TreeNode pai = null;
			TreeNode filho = null;
		    for (OpcoesMenu opM : opMenu) {
				if ( opM.getNivelPai() != null ){
				   pai = new DefaultTreeNode(opM , this.opcoesMenuTree);	
				}
				else {
				   filho = new DefaultTreeNode(opM, pai);
				}
			}
	   }
		return opcoesMenuTree;
	}
	
	public String opMenuSelecionada(NodeSelectEvent event ) {
		OpcoesMenu opsel = (OpcoesMenu) event.getTreeNode().getData();
		Integer nid = opsel.getIdFormulario();
		System.out.println("SELECIOANDA" + nid + opsel.getTitleFormulario() + " form : " + opsel.getNameFormulario()  );
		return "restrito/teste?faces-redirect=true";
	/*	FacesContext context = FacesContext.getCurrentInstance();
		NavigationHandler navHandler = context.getApplication().getNavigationHandler();
        navHandler.handleNavigation(context, null, "teste");   */
	}
	
	public TreeNode getSelectedNode() {
       return this.selectedNode;  
    }  
  
    public void setSelectedNode(TreeNode selectedNode) {  
	       this.selectedNode = selectedNode;  
	}

Ao retornar a pagina correspondente a seleção feita pelo usuário nada acontece, continua a página principal, nenhum erro NADA.

Alguem saberia me dizer como devo proceder ?

Abs

6 Respostas

R

Bom dia dluisbr :!:

não mexi com Prime ainda, mas talvez consiga te ajudar.
A navegação não está sendo ativada porque não está sendo executada uma ‘action’.
A utilização de um valueChangeListener não irá ativar a navegação.

Fiz algo parecido com richfaces executando uma action em Ajax:

<a4j:support event="onchange" action="#{meubean.action}" />

Acho que podes fazer desta forma 8)

C

No caso do Tree não sei exatamente como funciona pois nunca usei, tenho uma aplicação onde uso o menu do primefaces e chamo o managedbean dessa forma.

<p:submenu label="Arquivo" icon="ui-icon ui-icon-document"> <p:submenu label="Filme"> <p:menuitem value="Incluir" url="cadastra-filme.xhtml" icon="ui-icon ui-icon-disk" /> <p:menuitem value="Pesquisar" url="tabela-filmes.xhtml" icon="ui-icon ui-icon-search" /> </p:submenu> </p:submenu>

Perceba que chamo através do atributo “url”, no site do primefaces tem a documentação do mesmo, é um .pdf de 10mb, tem todos os componentes e seus atributos, garanto que com ela irá conseguir aproveitar todos os recursos dos componentes.

D

Qdo o usuário clica no TreeNode o metodo do ManagedBean é invocado, neste intante localizo a página corresponde à seleção feit e, via navegação implicita, retorno a string que é a página, só que nada acontece.
As sugestões feitas não surtiram efeito, mesmo assim obrigado, continuo na batalha.
Tks.

B

Amigo dluisbr, estou enfrentando o mesmo problema, no meu caso eu também utilizo primefaces, a unica diferença é que eu chamo um método quando o usuário clica em uma linha da “p:dataTable” isso faz uma requisição Ajax para o método, o método é chamado e tem como retorno uma string sendo ela a pagina que eu quero navegar, mais nada acontece TAMBÉM … rsrsrs.
Por acaso você conseguiu resolver isso?

Obrigado.

A

se for o que estou pensando…
tem 2 formas que conheço… você pode configurar no faces-config, que tem vários posts aqui no GUJ

ou

colocar um retorno no seu método do nome da página que você quer… por exemplo se vc ta na pagina cadastrar.xhtml e depois que cadastrar você quer ir pra listar.xhtml você faz +ou- asim com seu método

public String cadastrar(){
   //codigo
return "listar"
}
B

alandiniz, obrigado pela resposta, mas no meu caso eu já estava utilizando o retorno do método dessa forma:

public String cadastrar() {  
      //codigo  
      return "listar"  
   }

Isso não estava funcionando pra mim, mas depois de pesquisar achei uma solução que talvez sirva para mais alguém:

FacesContext.getCurrentInstance().getExternalContext().redirect("listar.xhtml");

O método passa a não ter mais retorno.

Espero ajudar.

Criado 21 de julho de 2011
Ultima resposta 1 de fev. de 2012
Respostas 6
Participantes 5