Meu caros tenho um probleminha:
Tenho uma pequena aplicação JSF 2.0 e primefaces que consiste basicamente de telas de pesquisa que preenchem datatable e neste cada linha possui botões que abrem telas de edição do registro selecionado, que é passado pra edição via setPropertyActionListener.
Os managedBean estão SessionScoped justamente pelo fato de quando selecionar um item do datatable e alterá-lo na tela de edição (o mesmo managedBean que lista os registros também grava/exclui ) , retorno para tela de pesquisa com o datatable preenchido e atualizado e com SessionScoped facilitou muito. Porém o tomcat do servidor que hospedo está dando permGen direto, enfim quero mudar pra ResquestScoped .
Pergunto:
- Tenho que separar o managedBean em edicao e de pesquisa pra passar o registro pesquisado para a edição e a lista de objetos pesquisados de volta pra tela de pesquisa?
- Quando voltar da tela de edição para a de pesquisa, como faço pra ter a tela de pesquisa preenchida com os registros anteriormente pesquisados (tenho que passar a lista dos itens pesquiados para o managedBean de ediçao quando vou alterar e passar a lista de volta para o managedBean de pesquisa?).
A sua tela de edição é um dialog ou uma outra página ? Se for um dialog, podes usar o viewscoped !
Usa @VewScope nos seus managedBean, tenta separar objetos que você preenche para gravar no banco com objetos que voce seleciona para alteração e exclusão.
E toda vez que fazer uma operação no banco você limpa tua lista, pois cada com este scope o ciclo de vida e por renderização.
public Collection<Empresa> getListaEmpresa() {
if(listaEmpresa == null) {
ObjectBDSearch<Empresa> dao = new EmpresaDAO();
listaEmpresa = dao.findAll();
}
return listaEmpresa;
}
Mas você não consegue atualizar o datatable após inserir/editar ? Assim ele recarrega a lista.
Não há necessidade de ser SessionScoped.
Cara, sua tarefa não vai ser fácil.
Vai estourar diversos erros. Esse é o problema do SessionScoped, ocupar muita memória do servidor.
O que você poderá fazer:
- Utilizar o ViewScoped. Assim que o usuário mudar de tela os dados voam.
- Utilize a consulta paginada. Não busque todos os itens existes no banco. Utilize o lazy do JPA também (caso se aplique).
- Datatable com RequestScoped costuma dar problema caso você venha a utilizar dialog ou coisas assim.
- Não tente alterar a tela/mb que já existe. É melhor você criar uma nova, aí você vai adicionando os componentes aos poucos (copiar e colar mesmo). Creio que assim fica mais fácil de tratar os erros que forem aparecendo.
Bem, aqui tem vários links que podem de ajudar:
-
JSF Mini Livro - Dicas, conceitos e boas práticas // Para entender melhor os escopos do JSF
-
Lazy JSF Datatable Pagination (Primefaces) // Consulta paginada utilizando primefaces. Caso você não esteja utilizando o Primefaces, o conceito que se deve aplicar é o mesmo.
-
Aplicação Web Completa JSF EJB JPA JAAS // Utilizando um datatble puro com request scope. Você pode reparar que o primefaces não foi utilizado
Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate // Mostra como realizar um datatable com viewscoped e dialogs com Primefaces.
OBS.: Só achei engraçado que todos os links são de um mesmo blog que se encontra por aí. :lol: :lol: :lol:
Pessoal,
edudebom : minha tela de edição é outra página. Realmente quando eu saio da tela de alteração , executo uma action que recarrega a lista e exibe a tela. Quando tentei Viewscope dataTable não atualizava. Mas como já faz um tempo vou tentar pra ver…
jtiagoarruda: quando eu estava criando , tentei usar VieweScoped, mas eu atualizava o registro, mas quando voltava o dataTable não atualizava, por isso mantive o sessionScoped. Os managedBean’s chamam Service’s que incluem/alteram/pesquisam os dados.
Fala jakefrog, esses link’s são referência .
Andei olhando um em que vc armazena o id mas te confesso que não li com a devida atenção.
Exato ! Esse foi um dos motivos que eu usei o Session, tenho um botão em que pega o item selecionado e colocava os dados pra alterar e gravar, cara, não preenchia os dados no dialoig nem a pau!! E essa operação é importante que seja feita com registro selecionado do dataTable.
Nem me fale, o que já apanhei disso não foi brincadeira.
Bom, vou dar uma boa estudada com calma e vou testando.
Agradeço imensamente a ajuda de todos!!!