No mundo de desenvolvimento de software é extremamente comum lidar com validações e conversões o tempo inteiro. Valores necessitam ser convertidos nos mais diversos tipos de sistemas, principalmente se os mesmos tiverem operações financeiras ou cálculos sendo efetuados. Diante desta realidade, alguns dos mais famosos frameworks criam cada vez mais recursos para facilitar a vida do desenvolvedor, bem como flexibilizar o uso de tais tecnologias, abstraindo certas funcionalidades que a própria ferramenta possa realizar por completo ou parcialmente.

O JSF (Java Server Pages) é um framework Java totalmente focado em componentes web (front side) em comunicação direta com o back end, no caso o Java. Baseado em blibliotecas de tags, com uma gama alta de componentes padrão para telas web, ele é capaz de fornecer a quem o utiliza inúmeros recursos para flexibilizar o trabalho de desenvolver telas e conectá-las com valores, neste caso representados pela figura de um ManagedBean.

Dentro deste framework é possível encontrar várias tags que lidam com validação e conversão de valores (Figura 1). Neste artigo iremos tratar, na teoria e na prática, atravé de exemplos, como o JSF lida com esses recursos. Será tratado como implementar as chamadas às tags de conversão, especialmente focadas na conversão de números.

JSF e ConvetNumber

Figura 1: JSF e ConvetNumber

Em JSF, a tag "f: convertNumber" é um dos conversores padrão que converte String em um formato específico, neste caso um "Número". Além disso, ele também é usado como um validador para verificar se o valor de entrada no backing bean, isto é, na classe Java de valores para a tela, é um número válido. Veja a seguir exemplos comuns e bastante usados:

Nota: Assumiremos que “#{meuBean.valor}” contém um valor de "0.1".

O primeiro exemplo mostra como podemos usar a tag citada para configurar um número mínimo de dígitos nas casas decimais para quando os valores do mesmo forem decimais. O nome do atributo é “minFractionDigits” e você pode conferir seu uso na Listagem 1.

Listagem 1: Uso do atributo “minFractionDigits” em listagem JSF

<h:outputText value="#{meuBean.valor}" >
	<f:convertNumber minFractionDigits="2" />
</h:outputText>

O valor que a Listagem 1 irá exibir no final será: “0.10”.

Outro atributo bastante utilizado para a tag é o atributo “pattern”. Para desenvolvedores que já tem conhecimento de Java ou linguagens OO, esse tipo de recurso é amplamente usado e de fácil percepção. Serve nada mais nada menos que para configurar como o valor será formatado para ser exibido no browser.

Nota: Esses tipos de recursos podem (e devem) ser usados dentro de tags que tem um atributo “value” e que possua valores numéricos. Caso contrário, exceções serão lançadas em tempo de execução.

Veja na Listagem 2 um exemplo de uso do mesmo.

Listagem 2: Uso do atributo “pattern” na tag convertNumber.

<h:outputText value="#{meuBean.valor}" >
	<f:convertNumber pattern="#0.000" />
</h:outputText>

O resultado será exibido como: “0.100”.

Nota: Os valores são formatados baseando-se nas definições da classe java.text.DecimalFormat.

Da mesma forma que a formatação de valores com pattern’s definidos exige a inclusão de certes regras, algumas outras bem semelhantes também se aplicam, tal como a formatação de valores monetários. O atributo “currencyCode” é usado para definir o tipo de código monetário que será utilizado junto com o atributo “type” (valor “currency”). A Listagem 3 mostra como fazer esse tipo de formatação.

Listagem 3: Formatação de valores monetários.

<h:outputText value="#{meuBean.valor}" >
	<f:convertNumber currencyCode="R$" type="currency" />
</h:outputText>

O valor que será exibido será: “R$0.10”.

Nota: Os padrões de definição do currency são baseados na ISO 4217. Veja na seção Links o link para a mesma.

O atributo “type” também pode ser usado para outras finalidades, como, por exemplo, para inferir formatações de percentuais para valores numéricos. Na Listagem 4 é possível verificar o uso do atributo.

Listagem 4. Uso do atributo “type=percent” para formatação de valores percentuais.

<h:outputText value="#{meuBean.valor}" >
	<f:convertNumber type="percent" />
</h:outputText>

O valor exibido no final será: “10%”.

Observação: Outras opções de atributos e formatadores podem ser encontrados na documentação oficial do JSF. Visite a seção de Links e confira.

Exemplo

Os exemplos demonstrados nas listagens anteriores podem ser implementados seguindo a seguinte linha de codificação.

ManagedBean

Um ManagedBean simples com uma propriedade valor. Atente para o uso das anotações de mapeamento para o JSF 2.0 (Listagem 5).

Listagem 5: ManagedBean para integração com tela


package br.edu.devmedia;
 
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
 
@ManagedBean(name="meuBean")
@SessionScoped
public class MeuBean implements Serializable{ 
	double valor; 
	public double getValor() {
		return valor;
	}
 
	public void setValor(double valor) {
		this.valor = valor;
	} 
}

Exemplo ConvertNumber (xhtml)

Na página valor.xhtml (Listagem 6), é possível visualizar o uso dos exemplos anteriores em um só local, tal como deverá constar no seu modelo de projeto.

Listagem 6: Página valor.xhtml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:body> 
    	<h1>Exemplos ConvertNumber</h1>
 	  <ol>
		<li>
			Valor [minFractionDigits="2"] : 
			<h:outputText value="#{meuBean.valor}" >
				<f:convertNumber minFractionDigits="2" />
			</h:outputText>
		</li>
		<li>
			Valor [pattern="#0.000"] : 
			<h:outputText value="#{meuBean.valor}" >
				<f:convertNumber pattern="#0.000" />
			</h:outputText>
		</li>
		<li>
			Valor [currencySymbol="$"] : 
			<h:outputText value="#{meuBean.valor}">
				<f:convertNumber currencySymbol="$" type="currency" />
			</h:outputText>
		</li>
		<li>
			Valor [currencyCode="R$"] : 
			<h:outputText value="#{meuBean.valor}" >
				<f:convertNumber currencyCode="R$" type="currency" />
			</h:outputText>
		</li>
		<li>
			Valor [type="percent"] : 
			<h:outputText value="#{meuBean.valor}" >
				<f:convertNumber type="percent" />
			</h:outputText>
		</li>
	   </ol> 
    </h:body>
</html>

Pronto. Só criar o projeto JSF e incluir os arquivos no mesmo. Não esquecer das configurações do JSF.

Conclusão

Nós cobrimos um pouco sobre o assunto neste artigo quando se trata de conversão e validação JSF. Na verdade, cobrimos a maioria do que você realmente precisa saber sobre esses processos para fazê-los trabalhar em suas aplicações (pelo menos para esta versão do JSF)!

Claro, não poderíamos ver tudo. Por exemplo, você pode querer verificar as mesmas funcionalidades fora do MyFaces (implementação padrão do JSF, logo, consulte outros recursos) para os componentes de validação não oferecidos eno JSF ou discutidos aqui. Além disso, em relação às conversões discutidas e mais comuns e técnicas de validação, há algumas que não podia estar inclusas aqui, para que não perdêssemos o foco do artigo. Por exemplo, ao escrever componentes personalizados você pode lidar com a conversão e/ou validação diretamente na decodificação do componente/processo de codificação (dependendo do tipo de componente e sua funcionalidade), mas nós vamos ter que salvar uma discussão mais aprofundada do desenvolvimento de componentes personalizada para um momento posterior.

Outra coisa a se ter em mente é que a conversão e validação, não necessariamente funcionam bem juntas. Conversão converte strings em objetos, enquanto a maioria dos validadores padrão trabalham em conexão. Portanto, você deve ter cuidado ao usar conversores personalizados e validadores juntos. Por exemplo, os nossos campos de texto não iriam funcionar com um determinado conversor de validador. Neste caso, você teria que escrever um validador personalizado, bem como, ou simplesmente incluir qualquer lógica de validação especial no conversor personalizado. Nós preferimos a segunda opção, pois permite simplesmente associar um conversor personalizado (com built-in à lógica de validação) com um tipo de objeto específico e o JSF lida bem com esse tipo de objeto. O JSF faz isso por nós automaticamente, sem ter que especificar quaisquer id's de conversor no JSP. (Claro, alguns podem chamar isso de programação preguiçosa, e não é necessariamente a melhor solução para todos os casos de uso.)

A discussão em artigo mostra, mais uma vez, que o JSF fornece uma estrutura flexível, poderosa e conectável para o desenvolvimento de aplicações web. Além de conversores padrão e validadores, ele facilita implementações personalizadas para acomodar tanto os desenvolvedores de aplicativos como estruturas semelhantes. Em última análise, a estratégia de conversão e validação você escolhe. O JSF permite que você facilmente e rapidamente comece (conversores padrão , validadores , validação de linha) durante a prototipagem, a migrar para soluções de produção mais sofisticadas (objetos personalizados, mensagens personalizadas), durante as fases de desenvolvimento posteriores. E ao longo de tudo isso, o ciclo de vida do aplicativo JSF fornece uma infra-estrutura confiável para garantir permanentemente a integridade do modelo de dados.

Links