Como exibir a FacesMessage depois do redirect com o escopo Flash do JSF

Postado por em   ●   21 comentários

Você sabe como fazer para exibir as mensagens JSF na tela mesmo após um redirect?

O JSF tem uma maneira bem específica de fazer uma mensagem chegar até o usuário do sistema.

É um jeito bem legal de se fazer isso, mas que NÃO dá, por padrão, o suporte para exibição de mensagens após um redirecionamento. Inclusive, esse é justamente o assunto de agora.

Continue lendo o artigo para aprender como usar o Flash do JSF para resolver esse problema.

O problema

Não é o mais comum, mas as vezes é necessário realizar alguma ação em nosso managed bean e, logo após, fazer um redirecionamento.

Imagine que, da página formulario-pagamento.xhtml, você chama a ação realizarPagamento que redireciona para a página pagamento-sucesso.xhtml:

Levando em consideração o método realizarPagamento acima, você vai querer mostrar a mensagem JSF na página pagamento-sucesso.xhtml através da tag h:messages:

O que vai acontecer é que a mensagem “Pagamento realizado com sucesso!” adicionada pelo método realizarPagamento NÃO será exibida. Isso acontece porque, por padrão, só é possível exibir as mensagens do JSF dentro do mesmo ciclo em que elas foram adicionadas.

Um redirect faz com que as mensagens sejam ignoradas, ou seja, quando chegar na página de destino, elas não estarão mais disponíveis.

Uma possível solução seria trocar o escopo do managed bean para @SessionScoped e usar um atributo “mensagem” para mostrar o aviso ao usuário, como no código abaixo:

E na página pagamento-sucesso.xhtml teríamos:

Alguns desenvolvedores chegam a fazer isso. Eu não considero uma solução ruim, mas, na dica de hoje, vou mostrar como postergar a disponibilidade dessas mensagens para que você consiga exibi-las, através da tag h:messages, mesmo após o redirecionamento.

Exibindo mensagens após redirecionamento

Para conseguir com que as mensagens sobrevivam ao redirecionamento, basta usar o código abaixo:

Essa linha vai fazer com que suas mensagens sejam armazenadas no escopo de Flash.

A duração desse escopo vai ser o suficiente para que você consiga exibir as mensagens adicionadas depois do redirecionamento.

O código completo do método ficaria assim:

É bem simples. Bastaria agora ter a tag messages em sua página de destino.

O que é o escopo Flash do JSF?

Como você deve ter reparado, eu citei que as mensagens são armazenadas no escopo de Flash.

Você já conhecia? Para quem nunca usou, vou explicá-lo melhor agora.

Esse escopo nos permite manter objetos disponíveis após um redirecionamento.

Tanto o redirecionamento mapeado com:

… quanto da forma como vimos anteriormente:

A duração desses objetos será até a página de destino ser renderizada, após isso eles serão ignorados.

Seu uso mais comum é com o objetivo que mostramos aqui, ou seja, para mensagens.

Mas, é possível também colocar outros objetos criados por você.

Veja:

Para acessar esse objeto em sua página de destino você pode usar assim:

ou assim:

Tirando o caso das mensagens, o uso desse escopo são para atividades bem pontuais.

Provavelmente você não precisará fazer um uso extenso dele, mas acredito que é bom saber que ele existe.

Conclusão

Os programadores que precisavam criar atributos em seu managed bean somente para exibir uma mensagem após o redirecionamento, agora tem uma solução bem melhor.

O JSF ainda NÃO possui uma anotação tipo:

Até porque ele não seria tão útil assim, os escopos existentes do JSF já resolvem tudo, ou quase tudo, do que precisamos.

Além do que é possível criarmos escopos customizados para nossos managed beans, e guardar as informações referentes a essa criação dentro do próprio escopo Flash do JSF, o que acabaria, claro, sendo um escopo Flash também.

Agora que você aprendeu sobre como exibir as mensagens JSF após um redirecionamento, talvez queira aprender mais sobre JSF com o livro Java EE 7 com JSF, PrimeFaces e CDI.

Você pode baixar o PDF do livro gratuitamente:

E-book Java EE 7 com JSF, Primefaces e CDI

Outra coisa importante é deixar seu comentário dizendo se gostou, se não gostou, uma opinião, crítica ou elogio. :)

Ele (o seu comentário) nos ajuda a decidir quais serão as próximas publicações.

Uma abraço e até uma próxima!

PS: o código-fonte dos exemplos desse artigo pode ser acessado em: http://github.com/algaworks/artigo-jsf-facesmessage-redirecionamento

É graduado em Sistemas de Informação, trabalha como instrutor na AlgaWorks e está no mercado de programação Java há mais de 8 anos, principalmente no desenvolvimento de sistemas corporativos.

21 comentários sobre “Como exibir a FacesMessage depois do redirect com o escopo Flash do JSF

  1. Masyaf saihttam -

    É uma boa dica. Eu já usei algo parecido com o Spring, onde você consegue redirecionar o usuário com atributos flash rsrs.
    Interessante a sua abordagem. Eu vi uma aplicação boa do seu tutorial em um logout de usuário.

  2. Alexandre Afonso Autor do post-

    Essa do logout é uma boa aplicação Masyaf. Talvez até teria utilizado como exemplo se tivesse vindo a minha cabeça no momento da escrita :)

    Abraço!

  3. Baltazar -

    Muito legal, parabéns. Uma pergunta: eu consigo pegar o objeto passado no escopo de flash no constructor do managed bean da pagina que foi redirecionada?

    1. Alexandre Afonso Autor do post-

      Valeu Baltazar!

      Tente assim: FacesContext.getCurrentInstance().getExternalContext().getFlash()

      Abraço!

  4. Cleber -

    Valeu! gostei muito não conhecia o escopo de flash. Parabéns

    1. Alexandre Afonso Autor do post-

      Bacana que gostou Cleber e valeu pelo comentário!

      Abraços!

  5. Mateus -

    Ótima dica, já vou adicionar nos meus Projetos! Parabéns pelo Post, muito bem explicado.

    1. Alexandre Afonso Autor do post-

      Valeu pelos parabéns Mateus!

      Bacana que curtiu.

      Abraços!

  6. Gustavo -

    Boa explicação Alexandre. Ainda estou novo no meio, mas tentando absorver tudo da melhor maneira possível. Andei brincando um pouco, vou testar.

  7. Henrique -

    Dica valiosa, eu tava justamente passando por essa dificuldade.

  8. Alexandre Afonso Autor do post-

    Obrigado Gustavo!

    É isso ai. Testar os componentes é a melhor forma de aprender.

    Abraço!

  9. Alexandre Afonso Autor do post-

    Legal que foi útil pra vc Henrique!

  10. Marcelo -

    ótima dica!!!
    Já vi (e tb já fiz) muitas gambiarras por conta dessas mensagens, kkkkk.

  11. Alexandre Afonso Autor do post-

    Valeu Marcelo! :)

  12. Arthur -

    Muito bom artigo. Me parece uma alternativa ao uso de ManagedProperties ou ate mesmo do Inject, em casos mais simples. Ou estou enganado?

  13. wemerson -

    top demaissssssss

    1. Alexandre Afonso Autor do post-

      Obrigado Wemerson!

  14. Alex Amorim -

    Muito Boa Dica ! ja tinha precisado usar o flash em uma empresa, e por sinal por esse motivo descrito no post rsrs, redirecionamento. só que não era só de mensagem kkk. gostei !

  15. Alexandre Afonso Autor do post-

    Valeu Alex!

  16. hvivox -

    Grande Alexandre Afonso,
    cara muito bom esse tutorial! há anos estava procurando algo que resolvesse esse problema e era obrigado a sempre mostrar o idEntidade na url para poder obter o parâmetro utilizando viewScoped.

    Minha duvida é essa é a solução definitiva para o problema? você ver alguma desvantagem?

    Achei mto importante quando vc disse que “A duração desses objetos será até a página de destino ser renderizada, após isso eles serão ignorados”

    abraços

  17. Alexandre Afonso Autor do post-

    hvivox, beleza?

    Não vejo problemas em se passar o idEntidade pela URL. Isso é bom porque a URL pode ser, por exemplo, guardada nos favoritos, e, se usasse o escopode flash, isso não seria possível.

    Essa solução do artigo é boa para mensagens, pois, as mensagens, nesse caso, só podem aparecer após a realização de alguma ação.

    Abraço!

Deixe um comentário