Chamar método ao carregar página [JSF]

Olá Pessoal,
Estou com uma dúvida, preciso chamar um método no bean com escopo de sessão sempre que uma página for carregada. Alguém sabe se existe uma tag para isso?
Estou utilizando JSF + RichFaces.

[]´s

Daniel

cara… conseguiu resolver isso?

Você pode inserir a chamada do método nas classes que são carregadas antes da sua página, ex.

A página1 tem um botão de ação que vai para a página2 (página2 seria o seu jsp que precisa pegar a sessão)
Quando o botão é acionado, é chamada uma classe que faz o que tem que fazer e no final chama seu método e envia as variáveis para a sessão, depois retorna para a página2.

A página2 apenas recolhe as variáveis da sessão.

cara… acontece que eu chamo minha página no menu assim:

<h:outputLink value="pages/pvt/ipd/pedido/cadastrar.jsf"> <h:outputText value="Pedido"/> </h:outputLink>
então não passa pelo meu controller antes de abrir a página…

alves.Felipe use o commandLink. Aponte o atributo “actionListener” para o método do teu managed bean.
Lembrando que esse método não deve ter retorno (void) e deve receber como parâmetro um ActionEvent (do faces, não da awt!).

Quanto ao (já muito velho e, presumo eu, resolvido) caso do yorgan: resolveu teu problema?

Também estou precisando de uma tag (ou qualquer outra coisa) que permita executar um método qualquer do meu managed bean. Se é que isso existe…
Se alguém souber de alguma maneira, por favor, share!!

Para chamar um método qualquer durante o carregamento da página, sem qualquer ação do usuário, eu simplesmente crio um objeto do tipo “input hidden” e atribuo para ele uma variável do bean, da mesma forma como faço em qualquer campo texto, porém no “get” desta variável não retorna apenas um return valor, mas sim a chamada do meu método e depois um return “” (vazio).

Pode não ser uma prática cinco estrelas, mas funciona.

Se vc usar o pattern mvc é fácil resolver esse problema. Cada página de vcs tem um managedBean por trás certo? Esse managedBean deve sempre ser do escopo request(em 99,99% dos casos) e devemos usar o keepAlive od a4j para que não morra enquanto estamos na página. Sendo assim, se queremos executar um método assim que carregarmos a página é só colocarmos uma chamada a esse método no construtor do managedBean, isso irá chamar o método assim que a página for renderizada, pois o ciclo de vida do JSF instancia a sua classe java assim que carrega sua página. Eu uso dessa maneira… []´s

1 curtida

Realmente desta forma é muito mais elegante e funciona, acabei de testar.

Nota: Que falta faz não ler a documentação do framework, pelo que você explicou, isso é um comportamento básico que eu deveria saber já que o estou utilizando.

1 curtida

É sim, faz parte do ciclo de vida do jsg. Isso resolve quase que 100% dos casos. Em um ou outro vc tem outras opções, como por exemplo usar a tag a4j:page que tem um evento onload, dai vc poderia usar o <a4j:support e executar o método que vc quiser pra executar junto com a página.

Mas eu ainda prefiro o construtor…hehe… []´s

Vocês podem achar essa prática até interessante, inclusive eu a utilizava. Porém verifiquei, que pelo fato do construtor carregar o que vem do controller, vários “selects” são executados sem necessidade, pelo motivo de qualquer chamada get que a página jsf dá em algum atributo ele entra no construtor. Estou tentando verificar uma maneira de algum cara chamar o método do controller, que preenche o form ao carregar a página jsf somente. Já tentei onLoad, mas não resolve, pois tenho q dar um reRender na tabela da pagina do jsf, e com isso ao chamar uma segunda página ele executa a renderização da tabela novamente e o redirecionamento para a outra página não funciona.
Abs,
Lessandro

De fato utilizar o construtor do managed bean de escopo “request” é a solução ideal para esse caso. No entanto, o colega disse que o seu bean é de sessão…

Acho isso uma falha do jsf, nao tratar a página como um objeto, como no Asp.net, por exemplo…onde voce pode usar o evento load da página. No jsf tem que sambar um pouco pra fazer isso…

lessandronp, esse problema que voce cita, pode ser resolvido usando uma tag para persistir o estado do bean de request (como o a4j:keepAlive que os colegas citaram)

Eh, vou dar uma olhada nesse cara.
O meu form é de escopo request e o controller session, pois não quero q um form dure a sessão inteira sem necessidade, ocupando instância na memória.
De qualquer forma consegui resolver o problema em partes, onde faço algo para verificar a página atual no construtor. De acordo com a página específica eu faço algo:


public UsuarioForm() { 
        FacesContext context = FacesContext.getCurrentInstance();
        UsuarioController controladorUsuario = (UsuarioController) context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(), &quot;#{usuarioController}&quot;,  UsuarioController.class).getValue(context.getELContext());

        String paginaAtual = context.getViewRoot().getViewId();
        boolean paginaExibirUsuarios = paginaAtual.lastIndexOf(&quot;exibirUsuarios.jspx&quot;) &gt; -1;
        
        if (paginaExibirUsuarios) {
          setListaUsuarios(controladorUsuario.getListaUsuarios());
        }
}

Mas mesmo assim ele faz duas requisições na lista de listarUsuarios, ao abrir a página a URL atual é de exibirUsuarios, porém ao clicar em algum item da tabela para abrir o cara selecionado, ele ainda
não mudou a url e executa mais uma vez. Teria que verificar a FaseListener para saber qual o estado atual desse cara. Ainda estou pesquisando algo, sem alguem souber como, agradeço desde já,
Abs,
Lessandro

Só pra acrescentar eu estou usando o 2.0 e ai basta fazer

<f:metadata>
	<f:event type="preRenderView" listener="#{meuMB.metodo}"/>
</f:metadata>

[quote=rafaelbtz]Só pra acrescentar eu estou usando o 2.0 e ai basta fazer

<f:metadata>
	<f:event type="preRenderView" listener="#{meuMB.metodo}"/>
</f:metadata>

[/quote]

Aí sim…fomos surpreendidos novamente.

Eh, me arrebentou do mesmo jeito, rs
Estou trabalhando com o jsf 1.2 e o facelets não tem suporte a metadata.
:confused:
Abs,
Lessandro

[quote=alias][quote=rafaelbtz]Só pra acrescentar eu estou usando o 2.0 e ai basta fazer

<f:metadata>
	<f:event type="preRenderView" listener="#{meuMB.metodo}"/>
</f:metadata>

[/quote]

Aí sim…fomos surpreendidos novamente.[/quote]

E fica ainda melhor, um pequeno requisito: “O usuário informe o seu cep em uma pagina e clique em localizar, então deve aparecer uma lista com as agencias bancarias mais perto do cep (Porém é obrigatório poder colocar essa segunda página no Favoritos). Com JSF 2 eu fiz isso assim”

Primeira pagina:

<h:form id="formAge">
	<h:outputText value="Cep:"/>
	<h:inputText value="#{listaAgMB.cep}"/>											
	<h:commandLink  value="Localizar" action="/agencias/lista.jsf?faces-redirect=true&amp;includeViewParams=true"/>
</h:form>

Explicação rápida do link:
/agencias/lista.jsf não preciso mais mapear no faces-config.xml coloco direto a pagina destino
faces-redirect=true faz com q seja GET;
amp;includeViewParams=true faz com q ele inclua os valores do form na URL
Se eu colocar o CEP 12300000 vai virar a URL www.blablabla.com.br/agencias/lista.jsf?CEP=12300000 com isso resolvo o problema de adicionar nos FAVORITOS

Segunda pagina

<f:metadata>
	<f:viewParam name="cep" value="#{listaAgMB.cep}" />
	<f:event type="preRenderView" listener="#{listaAgMB.listaAgencias}"/><!--Neste método eu localizo as agencias e coloco elas no ManagedBean-->
</f:metadata>

<!--Aqui vem a pagina normar exibindo as agencias da Lista-->

Assim tanto os usuários que vem da primeira pagina quanto os que gravar a segunda pagina nos favoritos vão ver a lista atualizada

Comecei com o JSF 2 no meio do ano passado quando estava em RC ainda, mas estou ficando realmente surpreendido com as melhoras.

Até mais…

Srs.
Vamos deixar essa thread morrer assim? Sem Solução?
Eu tb to afim de saber rs

[]'s

Se estiver usando RichFaces, faça algo como neste exemplo:

  <a4j:form  >

    <a4j:jsFunction action=[b]"#{bean.metodo}" [/b]  name=[b]"inicioX"[/b] />

   
  </a4j:form>

 </body>

Então…
Antes do onload do body, ele já inicia os componentes (EL’s e componentes). Sendo assim não há inicialização!

[]'s

[quote]
Então…
Antes do onload do body, ele já inicia os componentes (EL’s e componentes). Sendo assim não há inicialização! [/quote]

não entedi a colocação!

No projeto que estou desenvolvendo, consigo chamar um método logo quando a pagina carrega da maneira que postei.

Se precisar prencher um componente com valores, basta que seu método inclua valores aos atributos do bean. Adicione ao a4j:jsFunction o código para renderizar o componente desejado.

Ex:

<a4j:form >

<a4j:jsFunction action="#{infoBean.consulta}" name=“funConsultaInfo” reRender=“dtlista” />

<rich:dataGrid value="#{infoBean.lista}" var=“lista” id=“dtlista” columns=“1”>

                     <rich:panel >
                          <h:outputText value="Descrição: "  />
                          <h:outputText value="#{lista.descricao}"  /> 
                          <h:outputText value="Tags: "/>
                          <h:outputText value="#{lista.tag}"                               
                          <h:commandLink action="#{infoBean.atualizar}" value="visualizar">
                             <f:param name="pid" value="#{lista.id}" />
                          </h:commandLink>                              
                    </rich:panel>        
                </rich:dataGrid>

</a4j:form>

infoBean.consulta - o método inclue os valores nos atributos e preenche uma lista.
reRender=“dtlista” - renderiza a tabela e exibe os valores da lista assim que a pagina for carregada