Trabalhando com mensagens em JSF

abril 27, 2009

Nesse post simples pretendo discutir sobre como imprimir enviar mensagens para serem mostradas em componentes tipo <h:messages/> e como deixar as mensagens de validação em português.

Primeiramente,  vamos definir onde colocar as mensagens. Em Java, a forma mais simples de se fazer isso é configurando um arquivo de properties na sua aplicação. Chamamos isso de um message bundle.  Esse tipo de arquivo guarda informações do tipo chave=valor. Um exemplo seria:  sistemaMidias.erro.apagarMidiaInexistente=A mídia que se está tentando apagar não existe. Vamos definir esse arquivo dentro do diretório Web Pages da sua aplicação com o nome de mensagens.properties. Coloque as mensagens da forma que você quiser, lembrando que o conteúdo do lado esquerdo da vírgula sempre será a chave e o do direito o valor. É pela chave que você solicitará ao JSF para mostrar a mensagem específica.

As mensagens que definimos no arquivo mensagens.properties podem ser de dois tipos: mensagens específicas da aplicação em questão e mensagens de componentes do JSF. Quanto as mensagens desse segundo tipo, vamos conversar um pouco. Como os componentes em JSF são programados em inglês, as mensagens de erro também o são. Por exemplo, se um componente for definido como required=true, será mostrada uma mensagem em inglês dizendo “The field xyz is required”. Para deixarmos essas mensagens dos componentes JSF em inglês precisamos sobrescrevê-las em nossas aplicações. Para isso, basta colocar as chaves dessas mensagens no arquivo mensagens.properties que criamos para nossa aplicação e colocar os valores necessários. Alguns exemplos de mensagens que os componentes do JSF mostram, que poderíamos deixá-las em português, são:

javax.faces.component.UIInput.REQUIRED={0}: Preenchimento obrigatório.
javax.faces.converter.BigIntegerConverter.BIGINTEGER={0} deve ser um número de um ou mais dígitos.

javax.faces.converter.IntegerConverter.INTEGER={2}: deve ser um número de um ou mais dígitos.
javax.faces.converter.LongConverter.LONG={2}: deve ser um número de um ou mais dígitos.

Perceba que o que está entre chaves {} é o índice de um parâmetro para a mensagem. Por exemplo, para a mensgem javax.faces.component.UIInput.REQUIRED a parte do valor {0} será substituído pelo nome do componente.

Para uma lista mais completa de mensagens, clique aqui.

Definindo o arquivo mensagens.properties no faces-config.xml

Após definir as mensagens necessárias para o sistema, resta apenas configurar o arquivo faces-config.xml para referenciar esse arquivo de mensagens. Para isso, insira dentro do arquivo as seguintes tags:

<application>
 <message-bundle>mensagens</message-bundle>
 </application>

Mostrando mensagens em nossas páginas

Como foi visto acima, as mensagens que já foram definidas pelos componentes JSF, e que sobrescrevemos no arquivo mensagens.properties, serão mostradas automaticamente pelo JSF. Mas as mensagens que definimos especificamente para o nosso sistema precisamos colocar no “saco” de mensagens do JSF para que ele mostre.

Para isso, precisamos colocar um componente do tipo mensagem <h:messages/> em uma página e colocar no backing bean, no método action que se queira mostrar alguma mensagem, quer seja por erro ou algum aviso, as seguintes linhas:

FacesContext fc = FacesContext.getCurrentInstance();
 fc.addMessage("nomeComponenteDeMensages", MessageFactory.getMessage("sistemaMidias.erro.apagarMidiaInexistente",new String[]{}));

Percebeba que o primeiro parâmentro do método addMessage é o nome do componente de mensages da página JSF, p segundo é a mensagem cuja chave seja a que foi passado como parâmetro em MessageFactory.getMessage e o terceiro parâmetro são os possíveis parâmetros, em formato String, que podem ser passados para uma mensagem (com o uso de chaves {}).

Anúncios

3 Respostas to “Trabalhando com mensagens em JSF”

  1. Williame Rocha said

    olá, mt bom o artigo…mas me surgiu uma dúvida, se eu quiser, por exemplo, trocar a chave de uma mensagem padrão?? Como eu faria isso??

    Estou com um problema…não sei se é assim q se resolve, mas eu preciso gerenciar todas as mensagens, por exemplo, “Salvo com sucesso.”, “Atualizado..”, “Removido”, “Falha durante a transação”.

    Eu usei o Seam Generator e não sei como remover essa “responsabilidade” dele e deixar somente ao meu cargo.

    Quando executo uma operação, de inserção por exemplo. Eu crio uma mensagem mas ele tbm coloca a dele na tela…e aparecem duas mensagens. Vc teria alguma idéia?

    mt obrigado.

    • gugawag said

      Olá Williame.

      Não sou especialista em Seam (só li, mas nunca usei em projetos). Então, não saberia lhe responder se há uma forma de configurar mensagens customizadas usando essa tecnologia. Mas usando apenas JSF é editando um arquivo de message bundle, como explicado no post, e sobrepondo as mensagens padrão de JSF. Boa sorte.

  2. altieris said

    Muito bom post. Me ajudou muito. Obrigado e muito sucesso para você.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: