[RESOLVIDO] Navegação JSF 2.0 não funciona com PrimeFaces

Olá Pessoal.

Estive lendo alguns tutoriais na internet e tópicos aqui do fórum sobre a navegação no JSF 2.0, li que não precisamos mais configurar regras no faces-config.xml se não quisermos. O problema é que só consigo fazer a navegação quando utilizo o redirect. Quando utilizo a navegação normal ou implícita sem redirect, não abre a outra página.

Assim funciona:

<p:commandButton value="Navegar" action="testenaveg?faces-redirect=true"/>

Assim não funciona (clico no botão e a página não faz nada):

<p:commandButton value="Navegar" action="testenaveg"/>

Tentei também colocar em um ManagedBean assim:

[code]@ManagedBean
public class Navegacao {

public String navegar(){

    return "/testenaveg";
}

}[/code]

e na página assim:

    <p:commandButton value="Navegar" action="#{navegacao.navegar}"/>

Mas não funciona. Só funciona com redirect. Já tentei colocar System.out.println para imprimir quando o ManagedBean for criado e o método for executado, e está tudo ok. Já baixei os jars mais recentes do JSF 2.0, mas sem solução. Ja tentei colocar / antes do nome da página, ou mesmo .jsf no final, mas também não adiantou. Entendo a diferença entre forward e redirect, por isso não queria sempre ter de usar o redirect.

Alguém sabe o motivo ou já passou por esse problema? Estou usando NetBeans 6.9.1 e Tomcat 6, será alguma incompatibilidade?

Obrigado!

tire o / do managedbean e teste, senaum der certo post o erro aki… vc pegou os jar’s do JSF 2.0?

O Tomcat 6 suporta o JSF 2 ? Veja se no Tomcat 7 rola, e defina o tipo do command button para SUBMIT…

Abracos

exato!! jsf2.0 so funfa com tomcat7

num sei naum mas JSF naum tem submit tao explícito assim…

Obrigado pelas dias pessoal!

Tentei com o GlassFish Server 3 (já vem integrado no NetBeans), mas mesmo assim da erro:

INFO: Bean Criado!! INFO: Metodo abrirChamado executado!! GRAVE: javax.faces.FacesException: Unexpected error restoring state for component with id j_idt3. Cause: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0. at com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:239) at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:147) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1446) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457) at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:223) at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:177) at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:131) at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:430) at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:143) at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:199) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:161) at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1427) at com.sun.faces.application.view.StateManagementStrategyImpl$2.visit(StateManagementStrategyImpl.java:231) ... 37 more

Tentei colocar o type=“submit” também, mas foi indiferente. Vou tentar instalar o Tomcat 7 para testar. Estranho que com redirect funciona.

Se alguém tiver mais alguma idéia, agradeço!

Até +!

Pessoal,

Fiz o teste com o Tomcat 7, também não era esse o problema. Acabou funcionando com o Tomcat 6.

Consegui descobrir, mas não fiquei satisfeito: não esta funcionando pq estava usando Facelets. Quando criei uma nova página sem ser modelo de Facelets, deu certo!!!

Olha só:

Assim não funciona:

[code]

<?xml version='1.0' encoding='UTF-8' ?>

<ui:composition 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.prime.com.tr/ui
template="./vrmodelo.xhtml">

<ui:define name="left">
    <h:form>
        <p:panel id="panel" header="Menus">
            <p:commandButton value="Abrir Chamado" type="submit" action="#{navegacao.abrirChamado}" />
            <p:commandButton value="Administração" />
        </p:panel>
    </h:form>
</ui:define>

</ui:composition>[/code]

Assim funcionou!!!

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="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.prime.com.tr/ui">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>TODO supply a title</title>
    </head>
    <body>
        <h:form>
            <p:panel id="panel" header="Menus">
                <p:commandButton value="Abrir Chamado" type="submit" action="#{navegacao.abrirChamado}" />
                <p:commandButton value="Administração" />
            </p:panel>
        </h:form>
    </body>
</html>

Alguém sabe porque? Tem que fazer alguma configuração extra para funcionar com Facelets?

Obrigado!

Nas versões mais antigas do JSF para usar Facelets tinha que se colocar o renderizador dele no faces-config, mas a partir do JSF 2 não é mais necessário, será que o problema não esta com suas dependências, a lib do facelets esta dentro das suas dependências ?

Ivan, as minhas libs estão ok, o NetBeans não acusa pendências. Como vc disse, o JSF 2.0 já vem com o Facelets incluído. Inclusive consigo criar páginas baseadas em um template, ou seja, o Facelets tá funcionando normalmente. O problema é só com a navegação. Muito estranho. Vou tentar tirar o PrimeFaces também.

Se tiver mais alguma ideia, me avise!

Obrigado!

Pessoal,

Consegui fazer funcionar, mas sem o PrimeFaces. Olha que estranho:

Assim a navegação funciona:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition 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.prime.com.tr/ui"
                template="./vrmodelo.xhtml"> 

      <ui:define name="left">     

          <h:form>
                    <h:commandButton value="Abrir Chamado" action="#{navegacao.abrirChamado}" />
                    <h:commandButton value="Administração" />                
            </h:form>

        </ui:define>  

</ui:composition>

Assim a navegação não funciona:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition 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.prime.com.tr/ui"
                template="./vrmodelo.xhtml"> 
    
      <ui:define name="left">       

          <h:form>
              <p:panel id="panel" header="Menus">
                    <p:commandButton value="Abrir Chamado" action="#{navegacao.abrirChamado}" />
                    <p:commandButton value="Administração" />
                </p:panel>
            </h:form>

        </ui:define>   

</ui:composition>

Será que tem alguma incompatibilidade com PrimeFaces e Facelets?

Obrigado.

Pessoal, descobri.

A resposta ta no FAQ do PrimeFaces, realmente não funciona com forward (http://www.primefaces.org/faq.html):

  1. Why navigations do not work with PrimeFaces commandButton and commandLink?
    PrimeFaces does not support forward based navigations within an ajax request, you need to do redirect instead or set ajax to false.

Resolvi colocando assim:

<p:commandButton value="Abrir Chamado" action="#{navegacao.abrirChamado}" ajax="false" />

Alguém sabe as consequências de colocar ajax=“false” ?

Obrigado a todos pela ajuda!

Até +!

Cara, estou na mesma situação que você.
Conseguiu descobrir a melhor alternativa?

[quote=Marcio N Carvalho]Cara, estou na mesma situação que você.
Conseguiu descobrir a melhor alternativa?[/quote]

Olá!

Depende muito do seu caso. No meu caso o ajax=false resolveu, porém recarregou toda a página. Isso é porque não foi utilizado o ajax, que carrega de forma assíncrona somente os componentes da página que necessitam de ser atualizados.

A desvantagem é que normalmente perde-se todos os valores dos formulários, pois dependendo do escopo de seu ManagedBean, ele é limpado nessa nova requisição.

Até +!

<p:commandButton process="@this" value="Finalizar" action="#{registrarBean.finalizar}"/>

public String finalizar(){ return "home?faces-redirect=true"; }

assim funciona o forward com <p:commandButton/> do prime.

Eu faço assim :

<h:panelGrid columns="1" style="width: 100%;">
     <h:form>
          <h:commandLink  title="Incluir registro" action="#{paisFace.doCreatePais}" id="bt_nova">
                                    <p:graphicImage title="Novo registro" value="#{pageContext.servletContext.contextPath}/resources/imagens/incluir.png" alt="Novo registro"/>
          </h:commandLink>     

E no bean

    public String doCreatePais() {
        return "/basico/geografia/cadastros/pais/add.faces";
    }

Utilizo JSF 2.0 com glassfish 3.1