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