Como trabalhar com JSF no Scope Request? [Resolvido]

Olá pessoal.

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?

Obrigado.

Olá Pilantra, tudo bem?

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.

Por exemplo:

   <f:setPropertyActionListener target="#{pessoaMB.pessoa}" value="#{lista.pessoa}" />

Onde target, seria o MB que receberá o valor, e value o valor a ser injetado.

Tranquilo ?

Abraço!

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.

Tomahawk:
http://myfaces.apache.org/tomahawk/index.html

post do guj sobre o t:saveState (que é o que vc esta procurando eu imagino)
http://www.guj.com.br/posts/list/128238.java#691635

O ajax4jsf geralmente é preferido por quem usa o richfaces, pois ele ja vem no pacote:
post do guj sobre o a4j:keepAlive
http://www.guj.com.br/posts/list/123032.java#724099

Espero ter ajudado!

[]'s

Rapaz, ajudou muito, eu vou fazer as modificações.

Valeu!!!

Galera, eu achei que ia ser tão simples hehe.

Mudei meu bean para Request, mas o bean não se mantém vivo na tela seguinte. Será que é o jeito que eu estou redirecionando para outra página?

Eu estou redirecionando assim, quando clica no botão Editar, ele chama um método lá do bean:

try { FacesContext faces = FacesContext.getCurrentInstance(); ExternalContext context = faces.getExternalContext(); context.redirect(context.getRequestContextPath() + "/pessoa/editar.jsf"); } catch (IOException e) { e.printStackTrace(); }

Eu estou usando Spring com o Richfaces, então eu acho que não tem como usar a navegação do faces-config, então eu improvisei hehe.

Será que o keepAlive não funciona por causa dessa gambiarra ae??

Obrigado

Não conheço Spring, então não sei como ele pode interferir na navegação do faces. Mas tenta trocar a sua forma de navegação de:

FacesContext faces = FacesContext.getCurrentInstance(); ExternalContext context = faces.getExternalContext(); context.redirect(context.getRequestContextPath() + "/pessoa/editar.jsf");para:

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/

[]'s

Redirect não é forward!

Já tentou simplesmente utilizar um h:commandLink para trafegar entre as páginas ?

Pessoal valeu pela ajuda!! Eu vou fazer os testes e posto os resultados :slight_smile:

Abraços!

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!!!

Obrigado pela força!! :wink:

Abraços

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);

    public String showEditPage() {
        this.usuario = (Usuario) getCurrentDataTableItem();
        return "toEditPage";
    }
  • 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 String showEditPage() {
        Usuario usuarioToEdit = (Usuario) getCurrentDataTableItem();
        FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("usuarioToEdit", usuarioToEdit);
        return "toEditPage";
    }

e o construtor do Mbean…


    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.