JSF Mini Livro – Dicas, conceitos e boas práticas

85

Posted on September 2, 2012 by

Share it now!

Quando utilizar “action” ou “actionListener”

Toda requisição feita pelo usuário ao sistema pode-se entender como uma ação. Essa ação pode ter vários efeitos diferentes como alterar um registro no banco de dados, algum arquivo físico, uma navegação entre páginas, exibir uma informação, etc.

O JSF separa basicamente em dois modos esses tipos de ações: “com navegação” e “sem navegação”. As ações com navegação seriam as navegações em que direcionamos o usuário para outra tela como resultado final de uma ação a exemplo: “cadastrar uma cidade”, “entrar e sair do sistema”, etc. As ações sem navegação geralmente são chamadas Ajax ou chamadas de preparação para alteração do estado de objetos que estão na memória.

É preciso ter em mente que uma ação que gera uma navegação nem sempre irá levar o usuário para outra tela; no caso de um cadastro se o usuário não digitou todos os campos necessários ele continuará na tela e receberá uma mensagem de aviso notificando dos erros.

Ao utilizar os componentes “h:commandLink” e “h:commandButton”, os mais utilizados em ações, é possível ver a existência dos parâmetros “action” e “actionListener”. Podemos definir que “action” são as ações que utilizam navegações e “actionListener” como ação de requisição Ajax ou que irá modificar/preparar algum objeto sem navegação.

O modo correto de utilizar o “action” é apontar para um método de ManagedBean que em sua assinatura retorne uma String. A assinatura “public String cadastrar()” é uma assinatura válida de uma action. A String retornada irá indicar qual será o destino da ação solicitada pelo usuário. Após o retorno da String pelo método, o JSF tomará os seguintes passos:

  • Caso o valor retornado seja “null” o usuário permanecerá na mesma tela.
  • Caso o valor não tenha uma extensão válida, a extensão da view atual será utiliza. Ex.: Se na página “cadastro.xhtml” o método chamado retornar “paginaInicial” o JSF irá tratar como “paginaInicial.xhtml”.
  • Caso o valor retornado não comece com “/” o JSF irá tratar como “/paginaInicial.xhtml”.
  • O JSF irá verificar também regras de navegação incluídas no faces-config.xml
  • Qualquer valor retornado que não seja “null” fará com que o valor da view atual seja apagado. Imagine que o usuário está na página “cachorroCadastro.xhtml”, se o retorno do método for “null” o usuário continuará na página com os mesmos valores e uma nova navegação não será iniciada; caso o retorno seja a String “cachorroCadastro.xhtml” uma nova navegação será iniciada.

Já o “actionListener” requer uma assinatura diferente. Uma assinatura válida de um “actionListener” seria: “public void validarUsuario(javax.faces.event.ActionEventevent)”.

Em um botão é possível ter as duas chamadas ao mesmo tempo: “<h:commandButton action= “userMB.cadastrarUsuario” actionListener= “userMB.validarUsuario” />”. Repare que o click do botão chamará um método para validarUsuario e em outro é ação é para cadastrar o usuário.

Uma ação “actionListener” costuma ser utilizada muito nos componentes de view. Em um componente de paginação, seria utilizada uma ação de um actionListener para mudar as páginas que estão sendo exibidas sem executar uma navegação. Infelizmente pessoas acabam não utilizando esse recurso do modo correto e acabam por encontrar mais dificuldades do que necessário. Para fazer uma navegação a partir de uma ação “actionListener” teríamos que utilizar o método sendRedirect do HttpServletResponse; basta utilizar um método do tipo “action” para que essa navegação fosse realizada de modo simples e prático.

É aconselhável sempre usar as ações do tipo “action” em nos códigos JSF, caso a origem da ação não seja o código de um componente JSF ou uma chamada Ajax.

Response to JSF Mini Livro – Dicas, conceitos e boas práticas

1 3 4 5
  1. Bruno

    Hebert gostaria de parabenizá-lo pelo excelente trabalho que vc tem feito no Brasil, compartilhar o conhecimento e ajudar as pessoas é algo muito raro em um mundo tão egoísta como temos observado. Parabéns pela didática e o detalhamento passo a passo no seu material que ajuda todos os níves de estudantes. Qeu Deus abençoe muito a sua vida em todos os sentidos. Um abraço e parabéns pela iniciativa, tem me ajudado demais tb no trabalho.

    • uaihebert Post author

      Bruno, boa noite.

      Fico feliz que estou conseguindo ajudar.

      Valeu mesmo pelo apoio e pela força.

      Deus abençoe aí.

      Obrigado pela visita, e desculpe a demora em responder. Estive

  2. Cleiton Cardoso

    Parabéns pelo artigo Hebert.

    Eu estou com uma dúvida aqui, pelo que andei testando, no ViewScoped o MB não é eliminado da memória quando você fecha a página, só quando você faz um redirect dessa página. Isso é um comportamento que não tem como ser controlado?

    • uaihebert Post author

      Cleiton, boa tarde.

      Um jeito de controlar seria reduzindo o tamanho do tempo de sessão (3min por exemplo), e após fazer isso, você colocaria uma chamada Ajax de curtos períodos (2 em 2 min por exemplo) apenas para manter a sessão ativa.

      Espero ter ajudado, Obrigado pela visita.

  3. Fernando Sciuba

    Hebert , tenho uma dúvida, para um caso de um método synchronized que efetua a persistência no banco neste caso a melhor forma de garantir que somente uma requisição será executada por vez é utilizando o @ApplicationScoped na classe onde o método se encontra? ou não há a necessidade disso!?

    Obrigado e parabéns pelo site.

  4. Marcelo

    Ainda não li tudo, mas pelo que eu já vi estou achando excelente.
    Você poderia fazer também um mini livro de JPA.

    • uaihebert Post author

      Marcelo, boa noite.

      Já existe aqui no blog um mini livro de JPA. Existe também um chamado Consultas e Dicas só com diversas funções de Pesquisa no JPA.

      Até mais.

1 3 4 5

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current day month ye@r *