Páginas

quinta-feira, 3 de janeiro de 2013

Bind entre Formulário HTML e POJO




Assumindo um cenário sem frameworks MVC, sempre que vamos cadastrar ou alterar algum POJO (Plain Old Java Object) em um Servlet é a mesma história: precisamos construir primeiro o objeto atribuindo a suas propriedades os valores vindos em uma requisição HTTP através de request.getParameter("campo"), para depois então passar o objeto construído para o DAO. 

Por exemplo, veja o código abaixo:

POJO

public class Pessoa {
   private Integer id;
   private String nome;
   private String email;
   private String telefone;
   private String endereco;
   private String numero;
   private String bairro;
   private String cidade;
   private String estado;
   //getters e setters
}

Form
<form action="CadastrarPessoa" method="post">
      Nome: <input type="text" name="nome" /><br/>
      Email: <input type="text" name="email" /><br/>
      Telefone: <input type="text" name="telefone" /><br/>
      Endereço: <input type="text" name="endereco" /><br/>
      Numero: <input type="text" name="numero" /><br/>
      Bairro: <input type="text" name="bairro" /><br/>
      Cidade: <input type="text" name="cidade" /><br/>
      Estado: <input type="text" name="estado" /><br/>
      <input type="submit" value="Cadastrar" />
</form>

Servlet

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Pessoa pessoa = new Pessoa();
        pessoa.setNome(request.getParameter("nome"));
        pessoa.setEmail(request.getParameter("email"));
        pessoa.setTelefone(request.getParameter("telefone"));
        pessoa.setEndereco(request.getParameter("endereco"));
        pessoa.setNumero(request.getParameter("numero"));
        pessoa.setBairro(request.getParameter("bairro"));
        pessoa.setCidade(request.getParameter("cidade"));
        pessoa.setEstadol(request.getParameter("estado"));

       new PessoaDAO().cadastrar(pessoa);
}

Isso é realmente entediante, ainda mais se o POJO tiver vários campos.

E se houvesse uma maneira de preencher automaticamente um POJO com os dados do request? Uma maneira sem que precisássemos definir propriedade a propriedade? A biblioteca commons-beanutils da apache simplifica o trabalho com reflection e possui métodos convenientes para esse trabalho. O método que estamos falando é populate() da classe BeanUtils. Ele além de popular um beans também faz conversão automatica de tipo de dado. O jar commons-beanutils é um jar de dependencia em muitos frameworks.

Vamos criar uma classe auxiliar com um método estático que irá fazer esse trabalho.

public class Populate{
   public static void populate(Object pojo, HttpServletRequest request){
      BeanUtils.populate(pojo, request.getParameterMap());
   }
}

O método request.getParameterMap(); retorna um mapa com os pares nome da propriedade-valor. Exatamente o que o método populate de BeanUtils precisa para popular um bean. Porem para funcionar adequadamente, é preciso que o nome do campo do form HTML seja igual ao da propriedade do POJO.

Modificando então o nosso Servlet, vamos ter o código


protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Pessoa pessoa = new Pessoa();
        Populate.populate(pessoa, request);
        new PessoaDAO().cadastrar(pessoa);
}

Bem menos código não? E essa classe Populate ainda irá servir para contruir outros POJOs com campos completamente diferentes.

Atenciosamente,
Gustavo Marques


Nenhum comentário:

Postar um comentário

Veja também

Related Posts Plugin for WordPress, Blogger...