Problema com método de inicialização

73 views
Skip to first unread message

Lessandro Notaroberto Pyrâmides

unread,
May 26, 2015, 8:08:52 PM5/26/15
to jav...@googlegroups.com, jav...@googlegroups.com, javano...@googlegroups.com

Pessoal, boa noite.

Estou tendo problemas com o método de inicialização, juntamente com o escopo de visão do Spring.

Tenho um template e basicamente defino uma área onde altero o corpo da página via Ajax, evitando assim que

eu venha renderizar a página completamente.

 

<ui:define name="content">

  <h:panelGroup id="panelContent" layout="block">

     <ui:include src="#{companyBean.viewPage}" />

  </h:panelGroup>

</ui:define>

 

Tenho uma página inicial default.xhtml, e conforme vou chamando as páginas no menu, seto a viewPage com o valor

da página que desejo exibir.

Essa página default, fica responsável por disparar o método init do managed bean “CompanyBean”

 

<f:metadata>

      <f:event type="preRenderView" listener="#{companyBean.init()}"/>

</f:metadata>

 

 

Demais chamadas de menu, alterando a página a ser exibida:

 

<ul class="dropdown-menu">

   <li>

<h:commandLink value="#{msgs['label.viewGallery']}" action="#{companyBean.preparePage('gallery/viewGallery.xhtml')}"

              actionListener="#{companyGalleryBean.init()}">

             <f:ajax execute="@this" render=":panelContent" />

       </h:commandLink>

  </li>

</ul>

 

Método que altera a página a ser exibida:

 

public void preparePage(String page) {

setViewPage(page);

}

 

Onde está o problema? Ao chamar por exemplo a página viewGallery, o método “init” do managed bean CompanyGalleryBean

é chamado, até aí tudo ok, porém posteriormente como o escopo de visão é perdido, a página default.xhtml é restaurada, e o método

init do managed bean CompanyBean é chamado novamente, e a página fica presa no default.xhtml, e não é redirecionada para o viewGallery.

 

Numa segunda chamada, a página até é redirecionada para a viewGallery, porém como tenho um botão “novo” dentro

dessa página, ao acioná-lo, novamente perco a viewGallery do managed bean “CompanyBean”, e a página default.xhtml volta a ser a definida

no atributo “viewPage”.

Alguém sabe como solucionar esse problema? Antes da hipótese levantada, não acho adequado para este caso definir

esse managed bean com o escopo de Session, pois senão ficaria armazenando na sessão algumas coisas desnecessárias.

Também já tentei a utilização da anotação @PostConstruct, mas o comportamento é o mesmo.

 

Agradeço desde já,

Att,

 

Lessandro Notaroberto Pyrâmides
Analista de Sistemas Java Web e Android

Bacharelado em Sistemas de Informação - FMG
MBA em Gestão de Projetos em TI – UFJF
Email: 
lessandron...@gmail.com

Skype: lessandromg

Tels: +55 (32) 3213-6295 / +55 (32) 9108-6144
Juiz de Fora - MG

 

Lessandro Notaroberto Pyrâmides

unread,
May 27, 2015, 9:47:19 PM5/27/15
to jav...@googlegroups.com, jav...@googlegroups.com, javano...@googlegroups.com

Oi Rafael, boa noite.

A versão é a Mojarra 2.2.8. No escopo de sessão do Spring, a navegação ocorre normalmente,

mas o método de inicialização é disparado mais de uma vez, então o problema ocorre parcialmente.

O escopo de visão utilizado é o customizado do Spring. Tenho customizado aqui o escopo de visão

e flash, mas por agora tenho utilizado apenas o de visão. Teoricamente, a mudança de página não

deveria ser considerada, afinal estou utilizando mudança apenas na parte central. Vou analisar essa

questão do h:link e h:button.

Obrigado pela contribuição,

Att,

Lessandro

 

 

De: jav...@googlegroups.com [mailto:jav...@googlegroups.com] Em nome de Rafael Ponte
Enviada em: terça-feira, 26 de maio de 2015 22:19
Para: jav...@googlegroups.com
Cc: jav...@googlegroups.com; javano...@googlegroups.com
Assunto: [javace] Re: [javasf] Problema com método de inicialização

 

Olá,

 

Qual a versão do JSF você está usando? Já verificou se este problema acontece quando o escopo é sessão?

 

Outra dúvida, está usado @ViewScoped ou escopo view customizado do Spring?

 

Uma limitação do @ViewScoped é que ele se perde ao navegar entre páginas. Seja via ajax ou não. Por esse motivo, costumo recomendar que a entrada em cada página inicial de uma funcionalidade seja por navegação comum, através de um link HTML padrão. Nesse caso o componente h:link ou h:button pode ajudar se você achar mais conveniente. 

 

Um abraço!

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javasf.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/javasf/!%26!AAAAAAAAAAAYAAAAAAAAAIDG0h5s2GpCnXYRfYpy6fuigQAAEAAAAI9e0kwrbkBBnjdhI5BGCtEBAAAAAA%3D%3D%40gmail.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--

Rafael Ponte

TriadWorks | Formação Java
http://cursos.triadworks.com.br

 

--
Você recebeu essa mensagem porque está inscrito no grupo "java.ce" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javace+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para jav...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javace.
Para mais opções, acesse https://groups.google.com/d/optout.

Lessandro Notaroberto Pyrâmides

unread,
May 27, 2015, 9:47:24 PM5/27/15
to jav...@googlegroups.com, javace, javano...@googlegroups.com

Fala Arthur, bom dia, tudo bem?

Já tentei utilizar a viewAction, porém se coloco a mesma em cada página que será

renderizada no centro, o evento nem é disparado.

O mesmo dispara somente na página que implementa o template.

 

<ui:composition xmlns="http://www.w3.org/1999/xhtml"

       xmlns:f="http://java.sun.com/jsf/core"

       xmlns:h="http://java.sun.com/jsf/html"

       xmlns:ui="http://java.sun.com/jsf/facelets"

       template="#{request.contextPath}/resources/templates/template.xhtml"

       xmlns:sc="http://java.sun.com/jsf/composite/components">

 

<ui:define name="metadata">

<f:metadata>

     <f:viewAction action="#{companyBean.init()}" onPostback="true" />

</f:metadata>

</ui:define>

 

Nas demais páginas, defino dessa forma:

 

<f:metadata>

<f:viewAction action="#{companyProductBean.init()}" onPostback="true" />

</f:metadata>

 

Para esses dois questionamentos não faço tratamento, utilizando o preRenderView:

- seu metodo é invocado varias vezes devido a página enviar um postback e no seu metodo você não trata esta situação

- o evento de preRenderView não trata de forma "automatica" o postback

 

public void init() {

    if (!FacesContext.getCurrentInstance().isPostback()) {

        // ...

    }

}

Obrigado,

Abs,

Lessandro

 

De: jav...@googlegroups.com [mailto:jav...@googlegroups.com] Em nome de Arthur Gregório
Enviada em: quarta-feira, 27 de maio de 2015 08:52
Para: jav...@googlegroups.com
Cc: javace; javano...@googlegroups.com
Assunto: Re: [javace] Re: [javasf] Problema com método de inicialização

 

Li bem por cima do assunto, mas 2 coisas:

 

- seu metodo é invocado varias vezes devido a página enviar um postback e no seu metodo você não trata esta situação

- o evento de preRenderView não trata de forma "automatica" o postback

- se vc esta usando o JSF 2.2 por que não usar viewAction? nele você já consegue tratar esta situação do postback pelo parametro onPostback="true"

 

Se não estou muito enganado, para cada ação ajax que vc executar, um postback na página será executado.

 

at.,


Arthur P. Gregório
+55 45 9958-0302
@gregorioarthur
www.arthurgregorio.eti.br

 


Para mais opções, acesse https://groups.google.com/d/optout.

 

--

Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javasf.

Lessandro Notaroberto Pyrâmides

unread,
May 28, 2015, 9:47:36 AM5/28/15
to jav...@googlegroups.com, jav...@googlegroups.com, javano...@googlegroups.com

O que quero dizer em definir a utilização do template em todas as páginas, ao invés de

alterar o include apenas no centro, é por causa disso:



 

Reparem que o footer foi renderizado novamente, ou seja, a página é recarregada completamente.

Por isso a melhor solução nesse caso seria utilizar página dinâmica, e é isso que estou tentando com o
<f:viewAction ou <f:event, porém tenho que checar se não foi PostBack e mesmo assim para a navegação

de páginas não funciona, pois será um PostBack.

Abs,

Att,

 

Lessandro Notaroberto Pyrâmides
Analista de Sistemas Java Web e Android

Bacharelado em Sistemas de Informação - FMG
MBA em Gestão de Projetos em TI – UFJF
Email: 
lessandron...@gmail.com

Skype: lessandromg

Tels: +55 (32) 3213-6295 / +55 (32) 9108-6144
Juiz de Fora - MG

De: Lessandro Notaroberto Pyrâmides [mailto:lessandron...@gmail.com]
Enviada em: quarta-feira, 27 de maio de 2015 22:09
Para: jav...@googlegroups.com
Assunto: RES: [javace] Re: [javasf] Problema com método de inicialização

 

@Rafael Ponte, boa noite.

Aproveitando a sugestão que me fez, a alguns posts atrás, fiz a alteração para utilizar o <h:link.

 

<h:link value="#{msgs['label.manageProducts']}" outcome="product/manageProducts.xhtml" />

 

Também retornei para o <f:event, como disse o <f:viewAction não faz chamada caso eu não o coloque na

página de implementação do template.

 

<html xmlns="http://www.w3.org/1999/xhtml"

       xmlns:h="http://xmlns.jcp.org/jsf/html"

       xmlns:f="http://xmlns.jcp.org/jsf/core"

       xmlns:ui="http://xmlns.jcp.org/jsf/facelets"

       xmlns:p="http://primefaces.org/ui"

       xmlns:t="http://myfaces.apache.org/tomahawk"

       xmlns:sc="http://xmlns.jcp.org/jsf/composite/components">

 

 

<f:metadata>

      <f:event type="preRenderView" listener="#{companyProductBean.init()}"/>

</f:metadata>

 

<section class="title">

    <div class="container">

        <div class="row-fluid">

            <div class="span6">

                <ul class="breadcrumb pull-right">

                    <li><a href="home.xhtml">Home</a> <span class="divider">/</span></li>

                    <li><a href="#">#{msgs['label.config']}</a> <span class="divider">/</span></li>

                    <li class="active">#{msgs['label.manageProducts']}</li>

                </ul>

            </div>

        </div>

    </div>

</section>

 

Para sanar o problema das chamadas, inclusive as realizadas por post, executo apenas o init caso não seja “post”,

ou seja, get.

 

    public void init() {

       try {

           if (!FacesUtils.getContext().isPostback()) {

 

O problema que estou tendo agora é que o <h:link, assim como o <h:outputLink, não faz utilização do template, e pelo fato

de estar utilizando página dinâmica, apenas a página chamada é exibida, sem o conteúdo do template, com header,

footer, etc.

Tem alguma sugestão?

Obrigado,

Abs,

Lessandro

 

De: jav...@googlegroups.com [mailto:jav...@googlegroups.com] Em nome de Rodolpho Sbaraglini Couto
Enviada em: quarta-feira, 27 de maio de 2015 14:13
Para: jav...@googlegroups.com
Assunto: Re: [javace] Re: [javasf] Problema com método de inicialização

 

Tente colocar a tag <f:metadata> dentro do <h:head>.


Em quarta-feira, 27 de maio de 2015 13:56:17 UTC-3, Lessandro Notaroberto Pyrâmides escreveu:

Arthur e Rodolpho, o problema aparentemente não estava nos namespaces.

A página default.xhtml foi renderizada no corpo, mas a action “init” não foi

disparada.

 

Parte do template.xhtml

 

<ui:composition xmlns="http://www.w3.org/1999/xhtml"

       xmlns:f="http://xmlns.jcp.org/jsf/core"

       xmlns:h="http://xmlns.jcp.org/jsf/html"

       xmlns:ui="http://xmlns.jcp.org/jsf/facelets"

       template="#{request.contextPath}/resources/templates/template.xhtml"

       xmlns:sc="http://xmlns.jcp.org/jsf/composite/components">

 

       <ui:define name="content">

 

             <h:panelGroup id="panelContent" layout="block">

                    <ui:include src="#{companyBean.viewPage}" />

             </h:panelGroup>

 

       </ui:define>

 

 

Página default.xhtml

 

<html xmlns="http://www.w3.org/1999/xhtml"

       xmlns:h="http://xmlns.jcp.org/jsf/html"

       xmlns:f="http://xmlns.jcp.org/jsf/core"

       xmlns:ui="http://xmlns.jcp.org/jsf/facelets"

       xmlns:p="http://primefaces.org/ui">

 

<f:metadata>

     <f:viewAction action="#{companyBean.init()}" onPostback="true" />

</f:metadata>

 

<section class="title">

       <div class="container">

           <div class="left row-fluid">

               <div class="span6">

                   <h1>Home</h1>

               </div>

           </div>

       </div>

   </section>

 

</html>

 

Abs,

Att,

Lessandro

 

 

De: jav...@googlegroups.com [mailto:jav...@googlegroups.com] Em nome de Arthur Gregório
Enviada em: quarta-feira, 27 de maio de 2015 09:30
Para: jav...@googlegroups.com
Assunto: Re: [javace] Re: [javasf] Problema com método de inicialização

 

Observação super importante do Rodolpho, pode ser que o viewAction não funcione se não estiver com os NS certos.

 

Arthur P. Gregório
+55 45 9958-0302
@gregorioarthur
www.arthurgregorio.eti.br

 

Em 27 de maio de 2015 09:19, Rodolpho Sbaraglini Couto <rodolpho....@gmail.com> escreveu:

...

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javasf.

image001.png
image002.png

Lessandro Notaroberto Pyrâmides

unread,
May 28, 2015, 9:47:40 AM5/28/15
to jav...@googlegroups.com, javace, javano...@googlegroups.com

Então Rafael, mas o problema é com relação à performance...

Nesse caso estou definindo apenas um footer, imagina alguma parte da página que

seja pesada, e se repita em várias outras. Seria bem complicado ficar carregando

tudo novamente...

L

Abs

 

De: jav...@googlegroups.com [mailto:jav...@googlegroups.com] Em nome de Rafael Ponte
Enviada em: quinta-feira, 28 de maio de 2015 10:19
Para: jav...@googlegroups.com
Cc: javace; javano...@googlegroups.com
Assunto: Re: [javace] Re: [javasf] Problema com método de inicialização

 

Olá,

 

Normalmente eu prefiro que todas as minhas páginas sigam um template e sejam acessadas pela 1a vez através de uma requisição GET, depois disso podemos optar por navegação via ajax dentro daquela funcionalidade. 

 

Não curto seguir o modelo SPA (Single Page Application) com JSF.

 


Para mais opções, acesse https://groups.google.com/d/optout.



 

--

Rafael Ponte

TriadWorks | Formação Java
http://cursos.triadworks.com.br

--

Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javasf.

image001.png
image002.png

Lessandro Notaroberto Pyrâmides

unread,
May 28, 2015, 9:47:46 AM5/28/15
to jav...@googlegroups.com, jav...@googlegroups.com, javano...@googlegroups.com

O conceito seria sim de SPA sim Charles, pois estou mudando apenas o centro. A página é quase toda estática, onde apenas

esse centro é alterado. Menu, footer, header, e outros fragmentos são estáticos.

Realmente, está dando uma trabalheira danada, e até agora não consegui resolver o problema L

Abs

 

De: jav...@googlegroups.com [mailto:jav...@googlegroups.com] Em nome de Charles Queiroz
Enviada em: quinta-feira, 28 de maio de 2015 10:25
Para: jav...@googlegroups.com
Cc: JavaCE; javano...@googlegroups.com
Assunto: Re: RES: [javace] Re: [javasf] Problema com método de inicialização

 

Pelo o que vc falou agora, você quer usar Single Page Application com JSF? 

 

Acho que até consegue, mas é um trabalhão… pq o JSF não foi “desenhado” pra esse modelo de app… 

 

Não seria melhor usar outra tecnologia? AngularJS por exemplo já é feito pra esse tipo de abordagem. Mas dai não sei como é o seu projeto. Mas é isso mesmo? SPA com JSF?

 

Enfim… dá, dá… mas olha aew a trabalhera que está dando… 

 

Atenciosamente,

Charles Queiroz


Dazen™ IT Services
Technology - Software Development 

cha...@dazen.com.br

Fortaleza - CE
Phone: +55 85 9933 1585

 

On May 28, 2015, at 10:15, Lessandro Notaroberto Pyrâmides <lessandron...@gmail.com> wrote:

 

O que quero dizer em definir a utilização do template em todas as páginas, ao invés de

alterar o include apenas no centro, é por causa disso:

<image001.png>

<image002.png>


Para mais opções, acesse https://groups.google.com/d/optout.

 

--

Você recebeu essa mensagem porque está inscrito no grupo "java.ce" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javace+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para jav...@googlegroups.com.

Lessandro Notaroberto Pyrâmides

unread,
May 28, 2015, 9:47:51 AM5/28/15
to jav...@googlegroups.com, jav...@googlegroups.com, javano...@googlegroups.com

Existe até algo sendo explorado nesse link, porém eles utilizam o termo de SPI.

 

http://www.theserverside.com/tutorial/Creating-a-single-page-inteface-SPI-with-JSF-Facelets-Ajax-and-HTML5

 

Abs,

Lessandro

Lessandro Notaroberto Pyrâmides

unread,
May 28, 2015, 10:47:55 AM5/28/15
to jav...@googlegroups.com, jav...@googlegroups.com, javano...@googlegroups.com

É amigos, estou realmente quase abandonando SPA.

Reparei que o escopo de visão do Spring que estou utilizando é perdido em vários momentos,

mesmo estando na mesma página (fragmento da página). Até mesmo ao acionar uma simples

action para instanciar um novo produto via ajax, o usuário logado no sistema que foi

repassado para esse managed bean é perdido, assim estados de outras variáveis.

Abs

Luciano Sasso

unread,
May 29, 2015, 6:18:21 AM5/29/15
to javano...@googlegroups.com
Pessoal, estamos com confusão de conceitos não ?
SPA, não é simplesmente (não só por isso) quando temos uma
página que muda apenas o centro, ou mudam poucas coisas !!!
Pode ser justamente ao contrário, ou seja, quando temos páginas muito
dinâmicas, diferentes, e as montamos dinamicamente.

SPA é uma outra arquitetura, com todo controle do lado cliente em JavaScrip,
usando frameworks, e APIs por trás para a lógica de negócio/back end.

Usar SPA por usar só complica, neste caso específico citado, creio que JSF, facelets, ou algo
do tipo funcione melhor.

Att,
--
--
Você recebeu esta mensagem porque está inscrito no Grupo "javanoroeste" .
Academia Java e Academia Web em São José do Rio Preto.
DESTAQUE
http://www.destaquecapacitacao.com.br/
F: (17) 3216-7475 - fal...@destaquecapacitacao.com.br
Parceira oficial da Globalcode em SJ Rio Preto
--
Postar neste grupo, envie um e-mail para javano...@googlegroups.com
Cancelar inscrição envie e-mail para javanoroeste...@googlegroups.com
Mais opções, visite este grupo em http://groups.google.com/group/javanoroeste?hl=pt-BR
 
http://www.javanoroeste.com.br

---
Você recebeu essa mensagem porque está inscrito no grupo "javanoroeste" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javanoroeste...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.


--
Luciano Sasso Vieira
Data Scientist & Solutions Architect

luc...@gsgroup.com.br   |   tel: 17 3353-0833   |   cel: 17 99706-9335
www.gsgroup.com.br   



Avast logo

Este email foi escaneado pelo Avast antivírus.
www.avast.com


Lessandro Notaroberto Pyrâmides

unread,
May 29, 2015, 11:26:24 AM5/29/15
to javano...@googlegroups.com, jav...@googlegroups.com, jav...@googlegroups.com

Então amigo, aproveito a oportunidade, alterei todas as páginas para utilizar o template

e funcionou como o esperado. Parece que o JSF 2.3 fornecerá suporte SPA, permitindo

integração com frameworks como Angular, etc...

 

http://pt.slideshare.net/ianhlavats/jsf-23-presentation-integration-with-frontend-frameworks

 

As páginas seguiram basicamente o modelo abaixo:

 

<ui:composition xmlns="http://www.w3.org/1999/xhtml"

       xmlns:f="http://xmlns.jcp.org/jsf/core"

       xmlns:h="http://xmlns.jcp.org/jsf/html"

       xmlns:ui="http://xmlns.jcp.org/jsf/facelets"

       template="#{request.contextPath}/resources/templates/template.xhtml"

       xmlns:sc="http://xmlns.jcp.org/jsf/composite/components">

 

       <ui:define name="header">

             <ui:include src="header.xhtml" />

       </ui:define>

 

       <ui:define name="metadata">

             <f:metadata>

                    <f:viewAction action="#{adminBean.init}" onPostback="true" />

             </f:metadata>

       </ui:define>

      

       <ui:define name="content">

 

       <section class="title">

           <div class="container">

               <div class="left row-fluid">

                   <div class="span6">

                       <h1>Home</h1>

                   </div>

               </div>

           </div>

       </section>

            

       </ui:define>

 

       <ui:define name="bottom">

             <ui:include src="#{request.contextPath}/resources/includes/bottom.xhtml" />

       </ui:define>

 

       <ui:define name="footer">

             <ui:include src="#{request.contextPath}/resources/includes/footer.xhtml" />

       </ui:define>

 

</ui:composition>

 

Abs,

Att,

Lessandro

image001.png
image002.jpg
image003.png
image004.png
Reply all
Reply to author
Forward
0 new messages