Pessoal,
Me ajudem por favor com uma questão sobre redirecionamento, escopo e estado de objeto.
O cenário é o seguinte.
1 - Tenho um @ManagedBean (Bean1) com @ViewScoped que retorna uma lista com 10 objetos numa tabela da página origem.jsf.
2 - Faço um filtro no (Bean1) nos itens da tabela e removo 5 itens.
3 - Nos itens que restaram da tabela, tenho um link que direciona para outro @ManagedBean (Bean2) com @ViewScoped e esse direciona para uma página de detalhe (detalhe.jsf). Fiz o redirect dessa maneira:
public String verDetalhe(){
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("detalhe.jsf");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
4 - Na página de detalhes ao voltar para a página de origem. Os itens exibidos não guardam o filtro que havia feito, ou seja, é exibido os mesmos 10 itens iniciais.
O que preciso fazer para que a minha lista filtrada permaneça ao voltar para a página de origem?
O mesmo comportamento acontece se na página detalhe clico no “voltar” do browser.
Já tive problemas utilizando no (Bean1) o scopo de request -> A navegação da tabela não funcionou.
Poderiam me dizer qual é a melhor maneira de resolver isso? Pode ser uma dúvida primária, mas se tiverem algum exemplo, poderiam me indicar.
Muito obrigado.
O estado de um bean com O View-Scope se perde quando você vai para outra view. Já tentou fazer com forward ao invés de redirect?
Oi Leonardo,
Obrigado pela resposta. Mas neste caso eu ainda ia continuar indo para outro bean, não vai se perder do mesmo jeito?
Ainda não fiz o forward, mas fiz o seguinte teste.
Depois da página filtrada, clico em um link para uma página estática, sem passar por qualquer outro bean. Depois eu clico no “voltar” do browser e ainda tenho o mesmo comportamento que não traz filtrado.
Apenas para complementar.
Não estou utilizando o CDI.
Minhas configurações:
JBoss 7
JSF 2.0
Primefaces 3.2
Você poderia também exibir os detalhes em um modal ou em um outro panel via ajax na mesma página da listagem, assim sua listagem não sairia de escopo. Sem falar que fica mais rápido do que fazer um redirect ou forward.
É uma boa saida, vou tentar fazer dessa forma.
Talvez não fique tão interessante no cenário em que o usuário tenha alguns itens filtrados e clique no detalhe para que seja aberto em outra janela. Enfim, acho que vou ter aque abrir mão de alguma coisa.
Devido a restrições de especificação, não vou poder usar o panel nem o modal.
O comportamento solicitado é o seguinte: “Imagina que eu tenha feito uma pesquisa e filtro alguns resultados. Clico para visualizar detalhe de algum dos itens e clico em voltar”. Nesse caso teria mesmo que abrir outra página.
Alguém tem alguma sugestão?
Leonardo,
Já tentei usar o forward mas não deu certo.
Obrigado.
View só salva o estado em quanto você estiver na página, ele é ideal para trabalhar com dialogs.
Aqui explica como funciona cada escopo: JSF Mini Livro - Dicas, conceitos e boas práticas.
Você precisa colocar o valor no flashscope ou então na sessão. Não tem outro modo de fazer caso você mude de página.
O que você poderia fazer é manter todo mundo na mesma página e por ajax exibir/esconder os campos.
Hebert,
Obrigado pela ajuda. Optei pelo escopo de sessão e em partes consegui o comportamento que queria.
Tentei fazer meus filtros através de checkbox e com ele não tive o comportamento que gostaria, porém, ao alterar para commandlink passou a funcionar.
Um abraço.