Obtendo valores do Web.xml usando FacesContext

É comum usar context-param no web.xml para que algumas constantes sejam definidas para toda a aplicação. Em muitos casos precisei usá-los em aplicações JSF 2. Então o objetivo desse post é mostrar como obter contex-param descritos no web.xml a partir de um código java, usando obviamente o FacesContext.

Para declarar uma constante para toda a aplicação basta adicionar o seguinte código em seu web.xml:


<context-param>
<param-name>app.index</param-name>
<param-value>/pages/home.jsf</param-value>
</context-param>

Em qualquer ponto do código que tenha o context montado, ou seja, que consiga motar o FacesContext (Filter, Servlet, ManageBean, etc…)


FacesContext ctx = FacesContext.getCurrentInstance();

String minhaConstante = ctx.getExternalContext().getInitParameter("app.index");

 

Enjoy!

Intercionalização usando Bundles com JSF

Muitas vezes nossos sistemas são utilizados por diversas pessoas de diversas nacionalidades. Proporcionar que nosso usuário use o sistema na sua língua nativa é sempre interessante. Vou mostrar como fazemos isso com JSF.

Recursos utilizados:

  • Netbeans 7.1.2
  • Java 7
  • Glassfish 3.1.2
  • JSF 2
  • Maven

Observação: Seu Glassfish já deve ter as bibliotecas do JSF, se não tiver, procure os .jar e adicione a pasta lib do seu servidor.

Passo 1. Crie um projeto Web utilizando o recurso: Arquivo -> Novo Projeto -> Maven -> Aplicação Web.
Passo 2. Crie um diretório chamado resources dentro do diretório src/main.
Passo 3. Perceba que um novo diretório foi criado: “Outros Códigos Fontes”. Dentro dele temos o diretório reources. Nele crie um pacote chamado bundles.
Passo 4. Crie arquivos properties de internacionalização. Defina a mesma raiz para todos, por exemplo: mensagens. Assim alguns exemplos de arquivos são: mensagens_en.properties; mensagens_pt_Br.properties, e assim sucessivamente.

Para cada arquivo adicione as chaves e seus valores. O próprio netbeans ajuda a unificar essas chaves, mas a grosso modo cada arquivo deve ficar mais ou menos assim:

mensagens_en.properties:

save=Save
edit=Edit
delete=Delete

mensagens_pt_Br.properties:

save=Salvar
edit=Editar
delete=Excluir

Passo 5. Modifique o faces-config.xml adicionando dentro da tag application os locales suportados na sua aplicação, no nosso caso apenas o en e o pt_BR. O meu ficou assim por enquanto:

<?xml version='1.0' encoding='UTF-8'?>

<faces-config version=”2.0″
xmlns=”http://java.sun.com/xml/ns/javaee&#8221;
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221;
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd”&gt;
<application>
<locale-config>
<default-locale>pt_BR</default-locale>
<supported-locale>pt_BR</supported-locale>
<supported-locale>en</supported-locale>
<supported-locale>es</supported-locale>
</locale-config>
</application>

</faces-config>

Pronto, seu Bundle já pode ser usado chamando a tag f:loadBundles no seu arquivo xhtml.
<f:loadBundle basename=”bundles.mensagem” var=”msn”/>
#{msn.save}

Podemos ainda configurar essa chamada dentro do faces-config.xml para indicar qual é o bundle utilizado ao invés de por em cada xhtml ou no template:


<resource-bundle>
<base-name>bundles.mensagem</base-name>
<var>msn</var>
</resource-bundle>

Existem formas de otimizar a chamada do bundle, que deixo para a pesquisa. Vale lembrar que podemos ainda chamar o mesmo dentro dos nossos ManagedBens, que explicarei numa outra oportunidade.

Enjoy!