Duvida JSF [RESOLVIDO]

7 respostas
barcellosrod

E ae pessoal, estou com uma dúvida e gostaria que me ajudassem com a resposta.
Atualmente estou trabalhando utilizando JSF, Richfaces e durante a execução da aplicação observo que
a cada action, é sempre executado o construtor do meu managebean, mesmo sem sair da página. Seja selecionando
um novo valor em um combo, ou chexkbox.
Mesmo onde existem requisições ajax, utilizando componente ricos, o construtor do meu managebean é sempre
executado.
Gostaria de saber se isso é uma situação normal do jsf, se tem como contornar este problema, visto que desta forma
é necessário um cuidado maior para preservar o valor dos objetos a cada interação.
Obrigado e aguardo qualquer comentario…

7 Respostas

finotti

barcellos, é importante que você entenda bem o ciclo de vida de uma aplicação JSF.
Tem um outro tópico que trata desse assunto: http://www.guj.com.br/posts/list/130642.java
[]'s

edited:
http://www.guj.com.br/posts/list/33426.java

luiz.portnoy

Bom, pelo pouco que sei de JSF você tem 3 escopos (pelo menos até o 1.2. Parece que adicionaram o escopo View no 2.0): Request, Session e Application.

O Request é para cada requisição, o Session armazena por X tempo na área destinada no servidor e é acessível para o usuário logado e o Application serve para todo mundo.

Provavelmente o seu managed bean está com o escopo Request, por isso ele sempre é instanciado.

Como eu disse, eu sei pouco de JSF e daqui a pouco alguém deve te dar uma ajuda melhor.

Espero ter ajudado

barcellosrod

Correto, concordo contigo, estou utilizando o escopo de request, mas como se explica o fato de
em algumas situações de requisição ajax de combos, por exemplo, ir direto para o método relacionado
na action do componente e em algumas vezes executar o construtor antes de entrar em tal método.
Isso está um pouco confuso…

luiz.portnoy

Bom, nesse caso eu acho que o “culpado” é o ajax… Porque ele vai fazer a requisição mas não sei se ele verifica se o objeto ja ta instanciado ou não… Mas pelo menos no escopo Request, sempre será instanciado.

vitenho

coloca o bean no escopo request e usa a annotation @KeepAlive na classe do bean
isso vai fazer o bean viver entre requisiçoes ajax e ser recriado a cada requisicao GET para a URL que acessa esse bean.

valeu

barcellosrod
E ae Vitenho valew pela ajuda!!!

Consegui resolver o problema utilizando a sua dica, embora ja tenha tentado colocar tal marcação dentro do xhtml usando <t:saveState> e <a>rich:keepAlive</a>, algo que pra mim nao tinha resolvido, mas utilizando a anotação no bean resolveu mesmo;

Obrigado a todos que colaboraram;
vitenho

Don’t mention Sir (:

Criado 28 de maio de 2010
Ultima resposta 7 de jun. de 2010
Respostas 7
Participantes 4