Navegação AJAX JSF2.0 + Primefaces

8 respostas
diogozero

Galera, estou (tentando) utilizando Primefaces pra construir minha aplicação
Estou querendo fazer a navegação usando AJAX, estou usando o componente mas ele aparentemente não está fazendo o que deveria. Quando eu clico nele uma vez ele não atualiza o contâiner que eu quero (que está declarado em update=""), mas quando eu clico a segunda vez ele atualiza, só não entendo o porque não acontece da primeira vez.

Minha página
<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      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=iso-8859-1" />
        <title>Loocaliza</title>
        <style type="text/css">
            @import url('styles/main.css');
        </style>
        <link rel="shortcut icon" type="image/x-icon" href="icon.ico" />
    </h:head>
    <h:body>
        <div id="topo">
            <div id="busca">
                <h:form>
                    <p:inputText value=""/><p:commandButton action="buscar" value="Buscar"/>
                </h:form>
            </div>
        </div>
        <div id="conteudo">
            <div id="navhor">
                <div id="logincontrol">
                    <h:form>
                        <h:outputText value="Email:" /><p:inputText value="" styleClass="camposlogin" /><h:outputText value="Senha:" /><p:password minLength="6" feedback="false" styleClass="camposlogin" /><p:commandButton action="login" value="Login"/>
                    </h:form>
                </div>
                <div id="opcoes">
                    <h:form>
                        <ul> //É nesse trecho aqui embaixo que eu chamo os links que deveriam atualizar o container de ID "cc"
                            <li><p:commandLink ajax="true" update="cc" actionListener="#{navBean.principal}"><h:outputText value="Home" /></p:commandLink></li>
                            <li><p:commandLink ajax="true" update="cc" actionListener="#{navBean.teste}"><h:outputText value="Cadastrar" /></p:commandLink></li>
                            <li>Buscar</li>
                        </ul>
                    </h:form>
                </div>
            </div>
            <div id="central">
                <div id="barraesq">ae</div>
                <div id="conteudocentral">
                    //Este container deveria ser atualizado
                    <p:panel id="cc">
                        <ui:include src="#{navBean.currentPage}"/>
                    </p:panel>
                </div>
                <div id="rodapeconteudo"></div>
            </div>

        </div>
        <div id="rodape"></div>
    </h:body>
</html>
Meu ManagedBean
package com.loocaliza.web.mbeans.nav;

import java.io.Serializable;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;

/**
 *
 * @author Diogo
 */
@Named(value = "navBean")
@SessionScoped
public class NavigationBean implements Serializable {

    private String currentPage = "principal.xhtml";

    public NavigationBean() {
        
    }

    public String getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(String currentPage) {
        this.currentPage = currentPage;
    }

    public void principal() {
        currentPage = "principal.xhtml";
    }

    public void teste() {
        currentPage = "testeajax.xhtml";
    }
}
Desde já agradeço a ajuda!

8 Respostas

bobboyms

Boa noite!!! Tive um problema assim usando a implementação JSF 2.0 do MyFaces… Troquei pelo Mojarra funcionou tranquilamente…
Agora se tiver problemas com os Resources “CSS/JavaScript” apos o carregamento da pagina… bote isso no seu web xml:

<servlet>
 <servlet-name>Resource Servlet</servlet-name>
 <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>Resource Servlet</servlet-name>
 <url-pattern>/primefaces_resource/*</url-pattern>
 </servlet-mapping>

Trabalho muito com RichFaces, porem vejo no prime uma excelente alternativa!!

Abraços

gilvan.sfilho

Olá amigo,

Qual versão e implementação do JSF você está usando?
Tente utilizar a mojarra 2.0.3 que esse problema foi resolvido.

O blog quebrando paradigmas que um post que fala sobre esse problema.

AbraÇos.

diogozero

Opa Gilvan,

Iniciei meu projeto pelo Netbeans e pedi para usar as bibliotecas de JSF2.0 do servidor (no meu caso o Glassfish 3.1)
Na inicialização, ele mostra a seguinte linha:

INFO: Inicializando Mojarra 2.1.0 (FCS 2.1.0-b11) para o contexto '/Loocaliza-war'

Seria essa a implementação?

bobboyms

errado :

<p:commandLink ajax="true" update="cc" actionListener="#{navBean.principal}">

certo:

<p:commandLink ajax="false" update="cc" actionListener="#{navBean.principal}">
R

Boa tarde Diogo, tudo bem?

Estou iniciando no JSf e optei pelo PrimeFaces.

Comecei a me deparar com o mesmo problema que vc, carregar via ajax as páginas conteúdo através do meu menubar.

Bom, após pesquisar em alguns foruns achei um post com a seguinte dica, espero que ajude.

Chamada do menuitem:

<p:menuitem value="Servidor" actionListener="#{navBean.requestPage('servidor')}" update="centerContent" />

No meu caso, o container de destino é um dos meus layoutunits:

<p:layoutUnit id="centerContent" position="center" style="border: none;" scrollable="true" gutter="0" zindex="-1" styleClass="body bodyCadastro">
    <ui:include src="#{navBean.viewedPage}" />
</p:layoutUnit>

navigation bean:

@ManagedBean(name = "navBean")
@SessionScoped
public class NavigationBean implements Serializable {

	private String viewedPage;

	public NavigationBean() {
		viewedPage = "home.xhtml";
	}

	public String getViewedPage() {
		return viewedPage;
	}

	public void setViewedPage(String viewedPage) {
		this.viewedPage = viewedPage;
	}

	public void requestPage(String pageName) {
		viewedPage = pageName + ".xhtml";
	}

}

Espero ter contribuído.

gilvan.sfilho

diogozero:
Opa Gilvan,

Iniciei meu projeto pelo Netbeans e pedi para usar as bibliotecas de JSF2.0 do servidor (no meu caso o Glassfish 3.1)
Na inicialização, ele mostra a seguinte linha:

INFO: Inicializando Mojarra 2.1.0 (FCS 2.1.0-b11) para o contexto '/Loocaliza-war'

Seria essa a implementação?

Olá Diegozero,
é essa sim a versão da sua implementação.

Acho estranho isso pois pelo que vi, essa questão de não carregar ao primeiro clica tinha sido resolvido na versão 2.0.3… inclusive, como comentei no post acima, no blog quebrando paradigmas havia um post falando sobre navegação utilizando jsf e comentava esse erro. Darei um olhada no seu código e caso encontre algo anormal postarei aqui.

Abraços.

gilvan.sfilho

Cara, tente isso

<p:commandLink update="cc"><h:outputText value="Home" /> <f:setPropertyActionListener value="nomedapagina.faces" target="#{navBean.currentPage}"/> </p:commandLink>

  • o ajax=“true” pode ser omitido pois o primefaces trata por padrão todas as requisições como sendo requisições ajax.

  • o f:setPropertyActionListener value=“nomedapagina.faces” target="#{navBean.currentPage}" serve para você definir em #{navBean.currentPage} um valor (passado no value). Portanto, se você passar por exemplo: “nomedapagina.faces” o seu include quando for processado vai solicitar página “nomedapagina.faces”

Espero que tenha ajudado, abraços.

jeffev

Vlw ae me ajudo muito!!!

Fiz assim e funcionou 100%.

<p:menubar autoSubmenuDisplay="true"> <p:menuitem value="Home" icon="ui-icon ui-icon-home" action="#{navigator.setUrl('home.xhtml')}" update="centro"/> //restante do menu

<h:form id="centro"> <ui:include src="/paginas/#{navigator.url}" />

Criado 16 de julho de 2011
Ultima resposta 25 de ago. de 2012
Respostas 8
Participantes 5