Escopos de ManagedBean JSF 2.0

3 respostas
S

Boa noite pessoal,

Estou com a seguinte duvida: Eu tenho um Bean chamado usuarioBean, nele eu controlo todas as operações que podem ser feitas com os usuários que são: incluir, alterar, alterar senha e excluir. Para cada operação dessa eu tenho uma view (Tela XHTML) diferente.
Dado o cenário descrito eu tenho as seguintes duvidas.

1º É correto eu ter só um bean controlando todas as funcionalidades que podem ser feitas com um usuário ? ou seria melhor eu dividir em outros Bean’s ?
2º Esse meu bean tem o escopo de sessão (@SessionScoped). Só que vamos supor que eu entrei no sistema agora pela primeira vez e vou realizar o meu cadastro. Com isso vou chamar o método incluir do meu bean que foi informado mais acima (usuarioBean). Apos realizar o cadastro eu posso logar no sistema com o novo cadastro. Esse comportamento não seria mais recomendando num escopo de requisição ? Pois apos clicar no botão de incluir e mandar a requisição, meu Bean poderia ser esquecido pois eu iria assim fazer o login com o usuário que eu acabei de cadastrar ou com qualquer outro usuário (Caso eu esteja cadastrando outra conta e tenha outra conta para me logar). Se vocês acharem que o comportamento de incluir deve ser no escopo de Requisição, o que eu faria com os outros comportamentos (Alterar, Excluir…) ? Pois estes comportamentos só podem ser realizados quando o usuário se encontra logado no sistema então devem ser do escopo de sessão para eu poder manter no bean o estado dos dados do usuário a cada requisição. Como eu só estou utilizando 1 Bean para todos os comportamentos das view eu só posso escolher um dos escopos citados.

Espero não ter viajado muito nas duvidas.
Estou estudando o framework JSF a pouco tempo e me deparei com essas duvidas.

Obrigado a todos.

3 Respostas

Hebert_Coelho

SessionScoped tem a facilidade de você poder acessá-lo a qualquer momento, mas tudo fica na memória do seu servidor.

Caso você tenha uma lista com 300 caras sendo exibida em uma página, você terá esses 300 caras e seus atributos na memória do seu servidor apenas para um usuário.

Imagine agora diversos?

O ideal é o RequestScoped pois a cada requisição os dados serão enviados, tratados e esquecidos. Mas tem a desvantagem de você sempre precisar enviar o ID dos objetos tratados juntos. Você sempre irá precisar ter um inputHidden com o id para que ao receber as informações, você possa tratar da melhor maneira possível. Você teria um trabalho a mais para tratar isso.

Uma outra boa idéia e você utilizar o ViewScoped com dialogs ( e ajax). Ou seja, o ViewScoped mantém os dados na sessão enquanto a página é exibida. Uma vez que você navega para outra página os dados serão eliminados da memória do servidor. Mas aí para alterar/excluir você teria que abrir um dialog para acessar as informações do seu MB.

Esse post tem uma abordagem de um CRUD como RequestScoped: Aplicação Web Completa JSF EJB JPA JAAS.

S

Exatamente por esse motivo que tenho medo de usar o escopo de sessão Jakefrog.
O problema é que em algumas das view de usuário eu tenho funções Ajax para carregar determinados SelectOneMenu de Estado, Cidade e Bairro. Com o escopo de Request imagino que não tem como eu realizar esse comportamento.
E não posso usar o viewscoped porque já na parte de editar perfil eu tenho que jogar na tela todos os dados do usuário que ta logado e com essa mudança de view ele mata o Bean e me tras todas as variaveis limpas.

Hebert_Coelho

strikezado:
Exatamente por esse motivo que tenho medo de usar o escopo de sessão Jakefrog.
O problema é que em algumas das view de usuário eu tenho funções Ajax para carregar determinados SelectOneMenu de Estado, Cidade e Bairro. Com o escopo de Request imagino que não tem como eu realizar esse comportamento.
E não posso usar o viewscoped porque já na parte de editar perfil eu tenho que jogar na tela todos os dados do usuário que ta logado e com essa mudança de view ele mata o Bean e me tras todas as variaveis limpas.
Mas aí eh que entra a malandragem! =P
Você pode utilizar o FlashScope do JSF! \o/
Com ele você joga o objeto na sessão e pega do outro lado. [= JSF Exibindo Objeto e Mensagens após Redirect
Caso você não queira utilizar o FlashScope você pode fazer na unha mesmo, session.setAttribute e depois session.get + session.remove.

Com isso você mantém a memória do seu servidor limpinha. [=

Criado 22 de março de 2012
Ultima resposta 22 de mar. de 2012
Respostas 3
Participantes 2