Como usar o componente DefaultCommand do PrimeFaces

Postado por em   ●   13 comentários

Você precisa incluir mais de um botão dentro do seu formulário?

Ou então, talvez você já tenha ouvido alguém comentar de ter acontecido algo estranho logo após ter submetido o formulário.

Já ouviu?

Pois eu já ouvi. :)

Uma vez um cliente me mandou uma mensagem dizendo que quando ele ia salvar o registro os dados desapareciam.

Qual você acha que foi minha atitude na época?

Fui fazer testes nesse formulário para inserção do registro e, tudo funcionou direitinho!

Cliente, fiz os testes aqui e para mim está funcionando perfeitamente“.

Mas ele ainda insistia no erro.

Fiz mais um teste aqui, outro ali, e continuei com a conclusão de que tudo funcionava perfeitamente.

Até que um dia precisei ir até o cliente para resolver um outro assunto.

Claro, ele aproveitou para jogar o erro do formulário na minha cara. :-|

Olha aqui… Eu faço as alterações, aperto ENTER e limpa tudo!

Na hora pensei:

Putz… Ele submete o formulário apertando ENTER“.

O problema é que a ação que o formulário toma ao apertar ENTER é referente ao primeiro botão que está dentro do formulário, e o primeiro botão do formulário na época era LIMPAR.

Nos meus testes eu sempre submetia o formulário com o clique, ao invés de teclar ENTER.

Quem usa mais de um botão no formulário e não conhece o componente DefaultCommand do PrimeFaces, já sabe, meio que no subconsciente, que tem que submeter o formulário com o clique no botão.

No caso que contei para você, eu poderia resolver o problema, simplesmente, alterando a ordem dos botões, mas, considero isso quase uma gambiarra.

Fico no quase porque um formulário foi feito para submeter uma só ação, é o JSF que dá essa ajudinha para incluirmos mais de uma.

Enfim, prefiro usar a solução que vou mostrar pra você agora.

Componente PrimeFaces DefaultCommand

O DefaultCommand serve para configurarmos qual a action padrão de um formulário ao teclarmos ENTER (ou iniciando uma submissão que não seja através do clique no botão).

Veja:

Dessa forma você decide qual será a action padrão de um formulário sem correr o risco de algum outro programador alterar a ordem dos botões.

Você tem algum formulário CRUD?

Chamo de formulário CRUD aqueles que são utilizados ao mesmo tempo para as 4 operações clássicas (criar, ler, atualizar e deletar).

Nesses casos o programador acaba precisando trabalhar com o atributo “rendered” dos botões.

O botão Salvar, por exemplo, precisaria ficar escondido no estado de pesquisa do formulário.

Com isso, para cada estado do formulário (estado de pesquisa, criação e edição), poderíamos ter ações diferentes.

Pensando nesse tipo de situação, podemos usar o atributo rendered para controlar o DefaultCommand por estado:

Ou…

Podemos ter um target variável. Veja:

Repare que quebramos o sentido do nome default command (comando padrão), pois agora temos um comando padrão dinâmico, ou seja, não temos mais um comando padrão.

É… Foi uma observação inútil, eu sei.

Mas, de repente você tem uma outra informação inútil que combinada com essa aqui, vai passar a ter algum valor, vai saber. hehe

Conclusão: DefaultCommand ajudando na criação de formulários com mais de uma ação

A conclusão que cheguei foi que o componente DefaultCommand pode te economizar um bom tempo.

Ele vai evitar que você tenha que parar para ler e-mails ou atender ligações de clientes dizendo, de um jeito difícil de entender, que o formulário está limpando quando deveria salvar.

É isso! :)

E provavelmente, você que chegou até aqui, usa PrimeFaces no seu trabalho, não usa?

Então quero convidá-lo a baixar nosso e-book gratuito sobre Java EE 7 (e, claro, PrimeFaces) que NÃO vai deixar você fazer feio lá no seu meio do seu time:

Download grátis de E-book de Java EE 7

Depois do download do E-Book sobre Java EE 7 com PrimeFaces você pode também deixar um comentário com o sua opinião, adendo, ressalva, crítica ou elogio.

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

PS: o código-fonte do exemplo desse artigo pode ser acessado em:
http://github.com/algaworks/artigo-jsf-primefaces-defaultcommand

É 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.

13 comentários sobre “Como usar o componente DefaultCommand do PrimeFaces

  1. Carlos Eduardo da Silva -

    Excelente dica, muito obrigado!

  2. Alexandre Afonso Autor do post-

    Valeu pelo comentário Carlos Eduardo!

  3. Marcio Sava -

    Excelente dica na prática, muito bom!!! Valeu!!!

  4. Alexandre Afonso Autor do post-

    Bacana que gostou Marcio!

  5. João Arthur -

    Alexandre e seu eu quiser obrigar o usuário a clicar no botão, ou seja, eu não quero ter uma ação default, como eu faria ?

  6. Alexandre Afonso Autor do post-

    João, até onde sei não existe uma solução formal para isso. A que eu acho melhor seria colocar um botão, que não faz coisa alguma, como o primeiro dentro do seu h:form. Ai você pode colocar um id como id=”desabilitando-a-tecla-enter” e o process com o valor @none. Claro, tbm coloque um style com o valor “display:none;”.

    Abraço!

  7. João Arthur -

    Legal Alexandre! valeu!

  8. Alexandre Afonso Autor do post-

    Por nada. Abraço!

  9. Alex Amorim -

    Muito Boa Dica ! Muito Massa ! Voces Arrebentam em conteúdos bacanas !

  10. Alexandre Afonso Autor do post-

    E que bacana que está gostando Alex. Abraço!

  11. marcelo -

    Legal pois os usuários sempre acham uma forma diferente de usar um software.

    1. Alexandre Afonso Autor do post-

      Concordo Marcelo. :)

  12. Mário Jorge -

    Alexandre, o exemplo funcionou perfeitamente porém a pesquisa é bem mas lenta quando pressionado enter, tem ideia do que motiva a lentidão.

Deixe um comentário