: left" align=left>O Struts oferece muitas funcionalidades para o tratamento de entrada de dados, mas possui ainda algumas limitações nessa área. Quem utiliza o framework sabe da dificuldade para se tratar, por exemplo, datas e números decimais, e acaba utilizando strings para representar algumas informações que vêm do usuário.
Quando o usuário entra com valores em um formulário e os envia, estes chegam ao servidor em forma de strings. O Struts tenta converter essas strings para os formatos mapeados no FormBean (classe que representa um formulário), e caso não consiga, recebemos erros pouco explicativos ou páginas em branco; ou os valores podem ser tratados de forma equivocada. Por exemplo, em uma data como 10/03/06, o mês será 10, 03 ou 06? Para nós brasileiros, fica claro que o mês é março – mas e para o sistema?
Uma das soluções mais utilizadas é criar métodos no FormBean para tratar os dados enviados. Dessa forma, existiriam no FormBean dois métodos: um para converter para o tipo correto, no momento da entrada dos dados, e outro para converter para string no momento da exibição. O problema dessa solução é que ela se repetirá para todos os formulários que precisam da conversão, além de não se aplicar aos DynaActionForms (representações dinâmicas de formulários configuradas no struts-config.xml). Aqui veremos uma solução alternativa, que oferece vantagens.
Solução proposta
Para demonstrar nossa solução, vamos construir uma aplicação simples, com uma página JSP, um FormBean e uma Action. Usaremos uma classe concreta para representar o formulário, mas poderíamos igualmente utilizar um DynaActionForm. O exemplo completo está disponível no site da Java Magazine.
O JSP, como mostra a Listagem 1, constrói um formulário com dois campos de texto; o primeiro para uma data e o segundo para um número decimal. Note que para a construção do formulário utilizamos as tags do Struts <html:form> e <html:text>.
Listagem 1. index.jsp: Página com o formulário de exemplo.
<%@ taglib uri="/tags/struts
<html:form action="/PostFormularioAction">
Data: <html:text property="data" /><br />
Valor: <html:text property="valor" /><br />
<html:submit/>
</html:form>
O FormBean que representa este formulário terá dois atributos, um do tipo java.util.Date e outro do tipo java.math.BigDecimal. Veja a Listagem 2; observe que não temos atributos do tipo String. Isso porque faremos o Struts configurar o FormBean com os tipos de dados corretos, ou seja, o próprio framework irá converter os dados enviados pelo usuário para Date e BigDecimal.
A Action tem uma implementação simples. Ela fará apenas um forward para o JSP com o formulário (veja a Listagem 3). Nosso objetivo aqui é fazer com que o Struts configure o FormBean com seus devidos atributos. Não nos importa neste ponto o que será feito depois com estes valores.
A Listagem 4 mostra o conteúdo do arquivo struts
Listagem 2. FormBeanTeste.java: Classe que representa o formulário, com dois campos: um Date e outro BigDecimal.
package br.com.jm.formbean;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.struts.action.ActionForm;
...