Eu tenho um jsf com grid e um form, e renderizo-os conforme o que o usuário quiser, pesquisar ou dar manutenção nos dados.
Depois de muito quebrar a cabeça descobri que para nao instanciar novamente (e perder meus objetos) o meu MB eu teria q colocá-lo no escopo da sessão ou usar o t:saveState do Tomahawk.
O que eu gostaria de saber é, isso é um pau do jsf ou é erro (meu) de conceito??
Eu nao queria usar + 1 framework (Tomahawk) no meu projeto, entao utilizar todas os MB na session fica lento? Perde-se algo?
Cara…
Não é aconselhável você colocar todos os seus managedBean em escopo session pq eles ficam armazenados na sessão do usuário do seu servidor de aplicação. Depois de um tempo de utilização, além de ficar lento, você pode acabar com um “PermGen Space”, acabando com a memória do seu servidor de aplicação, tendo que reiniciá-lo constantemente.
Só use o escopo session com for realmente necessário senão pode acabar com sérios problemas de performance da sua aplicação.
Sim, é possível fazer funcionar sem o componente do Tomahawk e sem necessidade de colocar o managed bean na session.
Simplesmente faça teu método acessor da lista de resultados sempre carregar os mesmos valores a cada request, algo como:
public List<Produto> getProdutos() {
if (this.produtos == null)
this.produtos = ProdutosRepositorios.getProdutosPelaDescricao(this.descricao);
return this.produtos;
}
Observe que a consulta é sempre executada no método acessor e não mais no método de pesquisa. Enfim, isso foi um exemplo, o que você precisa entender é que a cada request você precisa dar um jeito de teu método produtos() retornar a mesma lista
Primeiramente gostaria de parabenizá-lo pelo seu grupo no google no qual participo.
Na realidade meu problema nao é com a lista.
Eu segui seu exemplo (JSF+AJAX de maneira eficiente) do teu blog mas eu não queria usar o Tomahawk.
O problema que tenho é quando eu seleciono um registro no <a4j:datatable .../>, o mesmo é transferido para um objeto (q representa a linha selecionada). Este objeto é apresentado normalmente no form de manutenção. Quando eu clico em um <a4j:commandButton action="#{meuMB.gravar}" ... /> ele chama o método gravar no MB, só que o objeto é "perdido", fica null, creio q seja porquê o MB foi instanciado novamente.
Como posso resolver isso?
Opa, obrigado O grupo existe realmente para troca de conhecimentos e experiência!
Bem, em escopo de request o seu managed bean será instanciado novamente e consequentemente o teu objeto que representa o formulário também o será, em seguida os dados do formulário serão convertidos e setados neste teu objeto.
O que está estranho é que seu objeto não deveria chegar como null no managed bean já que o formulário irá setar os valores dele na fase de atualização do modelo!
Poderia mostrar algum trecho de código deste formulário e o método de ação?
Abraços.