Bom, eu sou meio novo em JSF e como todo novato, só faz coisa errada hehe. Eu estou trabalhando com meus beans no scope Session, porque quando eu pensei, achei que ficaria mais fácil trabalhar quando se fosse passar um dado para outra tela.
Exemplo, tela de listagem de itens, o cara clica em Editar e abre a tela com o bean já populado e os dados para ele alterar.
Agora isso tá me dando uma dor de cabeça danada, porque eu tenho que ficar passando null pros beans quando eu preciso que eles fiquem “limpos”. E sem falar que ele fica guardando no cache tudo. Resumindo tudo, tá “foca” manter a aplicação.
Vocês poderiam me dizer, qual a maneira correta de trabalhar com o Request? Como eu posso passar um id de uma tela para outra por exemplo, para trabalhar como se fosse Session?
1º Fuja do Scope SESSION em sua aplicação, a menos que realmente necessite dele, ele é um dos principais responsáveis
por afundar a perfomance de uma aplicação. Chegou a ser citado em um artigo, como um dos 10 maus hábitos dos
desenvolvedores JSF.
Para trabalhar com o scope REQUEST, e trocar informações sobre diferentes páginas, a forma mais utilizada é utilizar a tag
f:setPropertyActionListener, onde você pode injetar em um Managed Bean um determinado valor.
Cara, vc pode usar alguma biblioteca que cria um escopo entre o request e o sesssion, que é o que o pessoal geralmente usa, isso se vc não estiver usando o seam, pois o seam ja tem um escopo maior que o de request e menor que o de sessão…
Caso vc estiver usando so jsf da uma olhada nas bibliotecas, tomahawk e ajax4jsf, ambas possuem os componentes que permitem vc fazer isto.
NavigationHandler navigationHandler = FacesContext.getCurrentInstance().getApplication().getNavigationHandler();
navigationHandler.handleNavigation(FacesContext.getCurrentInstance(), null, "SUA_STRING_NAVEGACAO");
Creio que desta forma vc esta fazendo um redirect e isto não mantem os dados na sessão.
Tem um post legal sobre isto no blog abaixo: http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/
Galera, funcionou!!! Ficou lindo o negócio!!! Só é uma pena que eu tenho que usar o faces-config pra manipular a navegação, mas com tempo eu vejo isso como fazer pelo bean ou pelo Spring!!!
Boa noite caros, estou iniciando em JSF e também estou tendo dificuldades para trabalhar com request scope. Pilantra como ficou sua solução para “transportar” de uma página para outra um item do DataTable?? O exemplo que estou tentando implementar tem as seguintes características:
Uma página de pesquisa e uma de edição, ambas associadas ao mesmo managed bean;
No datatable tenho uma coluna com um commandLink que invoca o método que exibe a tela de detalhes (showEditPage);
No request scope, o método nem sequer é invocado, então coloquei em view scope;
Dessa forma, ao clicar no link a página de detalhes é exibida com os campos vazios;
Para resolver, no corpo do método showEditPage coloquei o item selecionado no datatable dentro do requestMap e o recuperei dentro do construtor do
managed bean;
public ManterUsuarioMBean() {
if (FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("usuarioToEdit") != null) {
usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("usuarioToEdit");
}else{
usuario = new Usuario();
}
}
Dessa forma --> utilizando viewscope, salvando o item no request e recuperando dentro do construtor do managedbean foi a única maneira que consegui encontrar para solucionar este simples caso;
Uma tarefa TÃO simples mas que deu um certo trabalho que não esperava com beans de request, que nesse caso nem mais de request é e passou a ser de view!
Gostaria de saber se existe alguma outra forma mais simples de se construir essa funcionalidade básica sem ser necessária a utilização de outras bibliotecas. []'s.