Este artigo demonstra como implementar uma funcionalidade de atualização de dados em uma aplicação Java Web, utilizando Servlets, JSP e MyBatis. O exemplo aborda a separação de responsabilidades entre a interface do usuário e a lógica de negócio, com código reescrito para maior clareza e manutenibilidade.
- Página JSP para Edição de Dados A seguir, apresenta-se uma página JSP que permite ao usuário visualizar e editar informações pessoais. O formulário utiliza expressão da linguagem EL para preenchimento dinâmico de dados. Ver código
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>
<html lang="pt">
<head>
<meta charset="UTF-8">
<title>Edição de Dados</title>
<style>
/* Estilos globais */
body {
font-family: 'Arial', sans-serif;
background-color: #f0f2f5;
color: #333;
margin: 0;
padding: 20px;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
/* Container do formulário */
.form-container {
background-color: #fff;
padding: 25px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 550px;
}
/* Rótulos */
label {
display: block;
font-weight: bold;
margin-bottom: 5px;
color: #555;
}
/* Campos de entrada */
input[type="text"],
input[type="date"],
input[type="number"] {
width: 100%;
padding: 10px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
font-size: 14px;
}
/* Efeito de foco */
input:focus {
border-color: #007BFF;
outline: none;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.2);
}
/* Botão de envio */
input[type="submit"] {
background-color: #007BFF;
color: white;
padding: 10px 15px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
transition: background-color 0.3s ease;
}
input[type="submit"]:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<form action="${pageContext.request.contextPath}/salvarServlet" method="post">
<!-- Campo oculto para ID -->
<input type="hidden" name="codigoPessoa" value="${pessoa.codigoPessoa}">
<label for="dataAvaliacao">Data da Avaliação:</label>
<input type="date" id="dataAvaliacao" name="dataAvaliacao" value="${pessoa.dataAvaliacao}" required>
<label for="motivoAvaliacao">Motivo da Avaliação:</label>
<input type="number" id="motivoAvaliacao" name="motivoAvaliacao" value="${pessoa.motivoAvaliacao}" required>
<label for="nome">Nome:</label>
<input type="text" id="nome" name="nome" value="${pessoa.nome}" required>
<label for="genero">Gênero:</label>
<input type="text" id="genero" name="genero" value="${pessoa.genero}" required>
<label for="dataNascimento">Data de Nascimento:</label>
<input type="date" id="dataNascimento" name="dataNascimento" value="${pessoa.dataNascimento}" required>
<label for="cpf">CPF:</label>
<input type="text" id="cpf" name="cpf" value="${pessoa.cpf}" required>
<label for="cartaoSus">Cartão SUS:</label>
<input type="text" id="cartaoSus" name="cartaoSus" value="${pessoa.cartaoSus}" required>
<label for="etnia">Etnia:</label>
<input type="text" id="etnia" name="etnia" value="${pessoa.etnia}" required>
<label for="escolaridade">Escolaridade:</label>
<input type="number" id="escolaridade" name="escolaridade" value="${pessoa.escolaridade}" required>
<label for="religiao">Religião:</label>
<input type="number" id="religiao" name="religiao" value="${pessoa.religiao}" required>
<label for="estadoCivil">Estado Civil:</label>
<input type="number" id="estadoCivil" name="estadoCivil" value="${pessoa.estadoCivil}" required>
<label for="situacaoMoradia">Situação de Moradia:</label>
<input type="number" id="situacaoMoradia" name="situacaoMoradia" value="${pessoa.situacaoMoradia}" required>
<label for="formaPagamento">Forma de Pagamento:</label>
<input type="number" id="formaPagamento" name="formaPagamento" value="${pessoa.formaPagamento}" required>
<label for="fonteRenda">Fonte de Renda:</label>
<input type="number" id="fonteRenda" name="fonteRenda" value="${pessoa.fonteRenda}" required>
<label for="demencia">Demência:</label>
<input type="number" id="demencia" name="demencia" value="${pessoa.demencia}" required>
<label for="doencaMental">Doença Mental:</label>
<input type="number" id="doencaMental" name="doencaMental" value="${pessoa.doencaMental}" required>
<label for="doencasCronicas">Doenças Crônicas:</label>
<input type="text" id="doencasCronicas" name="doencasCronicas" value="${pessoa.doencasCronicas}" required>
<label for="quedas">Quedas:</label>
<input type="number" id="quedas" name="quedas" value="${pessoa.quedas}" required>
<label for="desaparecimentos">Desaparecimentos:</label>
<input type="number" id="desaparecimentos" name="desaparecimentos" value="${pessoa.desaparecimentos}" required>
<label for="engasgos">Engasgos:</label>
<input type="number" id="engasgos" name="engasgos" value="${pessoa.engasgos}" required>
<label for="suicidios">Suicídios:</label>
<input type="number" id="suicidios" name="suicidios" value="${pessoa.suicidios}" required>
<label for="observacoes">Observações:</label>
<input type="text" id="observacoes" name="observacoes" value="${pessoa.observacoes}" required>
<label for="nomeInformante">Nome do Informante:</label>
<input type="text" id="nomeInformante" name="nomeInformante" value="${pessoa.nomeInformante}" required>
<label for="parentesco">Parentesco:</label>
<input type="text" id="parentesco" name="parentesco" value="${pessoa.parentesco}" required>
<label for="nomeContato">Nome do Contato:</label>
<input type="text" id="nomeContato" name="nomeContato" value="${pessoa.nomeContato}" required>
<label for="telefoneContato">Telefone do Contato:</label>
<input type="text" id="telefoneContato" name="telefoneContato" value="${pessoa.telefoneContato}" required>
<input type="submit" value="Salvar">
</form>
</body>
</html>
- Servlet para Carregamento de Dados Este Servlet é responsável por buscar os dados existentes e direcionar para a página de edição. Ele utiliza um serviço para acessar a camada de persistência. Ver código
package com.exemplo.web;
import com.exemplo.entidade.Pessoa;
import com.exemplo.servico.ServicoPessoa;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/editarServlet")
public class EditarServlet extends HttpServlet {
private ServicoPessoa servico = new ServicoPessoa();
@Override
protected void doGet(HttpServletRequest requisicao, HttpServletResponse resposta)
throws ServletException, IOException {
requisicao.setCharacterEncoding("UTF-8");
resposta.setContentType("text/html;charset=utf-8");
String codigo = requisicao.getParameter("id");
Pessoa dadosPessoa = servico.buscarPorId(codigo);
requisicao.setAttribute("pessoa", dadosPessoa);
requisicao.getRequestDispatcher("/editar.jsp").forward(requisicao, resposta);
}
@Override
protected void doPost(HttpServletRequest requisicao, HttpServletResponse resposta)
throws ServletException, IOException {
this.doGet(requisicao, resposta);
}
}
- Servlet para Salvamento de Atualizações Este Servlet processa as alterações enviadas pelo formulário e persiste as mudanças no banco de dados. Ele converte os parâmetros para objetos e chama o serviço de atualização. Ver código
package com.exemplo.web;
import com.exemplo.entidade.Pessoa;
import com.exemplo.servico.ServicoPessoa;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/salvarServlet")
public class SalvarServlet extends HttpServlet {
private ServicoPessoa servico = new ServicoPessoa();
@Override
protected void doGet(HttpServletRequest requisicao, HttpServletResponse resposta)
throws ServletException, IOException {
requisicao.setCharacterEncoding("UTF-8");
resposta.setContentType("text/html;charset=utf-8");
Pessoa dados = new Pessoa();
dados.setCodigoPessoa(requisicao.getParameter("codigoPessoa"));
dados.setDataAvaliacao(requisicao.getParameter("dataAvaliacao"));
dados.setMotivoAvaliacao(Integer.valueOf(requisicao.getParameter("motivoAvaliacao")));
dados.setNome(requisicao.getParameter("nome"));
dados.setGenero(requisicao.getParameter("genero"));
dados.setDataNascimento(requisicao.getParameter("dataNascimento"));
dados.setCpf(requisicao.getParameter("cpf"));
dados.setCartaoSus(requisicao.getParameter("cartaoSus"));
dados.setEtnia(requisicao.getParameter("etnia"));
dados.setEscolaridade(Integer.valueOf(requisicao.getParameter("escolaridade")));
dados.setReligiao(Integer.valueOf(requisicao.getParameter("religiao")));
dados.setEstadoCivil(Integer.valueOf(requisicao.getParameter("estadoCivil")));
dados.setSituacaoMoradia(Integer.valueOf(requisicao.getParameter("situacaoMoradia")));
dados.setFormaPagamento(Integer.valueOf(requisicao.getParameter("formaPagamento")));
dados.setFonteRenda(Integer.valueOf(requisicao.getParameter("fonteRenda")));
dados.setDemencia(Integer.valueOf(requisicao.getParameter("demencia")));
dados.setDoencaMental(Integer.valueOf(requisicao.getParameter("doencaMental")));
dados.setDoencasCronicas(requisicao.getParameter("doencasCronicas"));
dados.setQuedas(Integer.valueOf(requisicao.getParameter("quedas")));
dados.setDesaparecimentos(Integer.valueOf(requisicao.getParameter("desaparecimentos")));
dados.setEngasgos(Integer.valueOf(requisicao.getParameter("engasgos")));
dados.setSuicidios(Integer.valueOf(requisicao.getParameter("suicidios")));
dados.setObservacoes(requisicao.getParameter("observacoes"));
dados.setNomeInformante(requisicao.getParameter("nomeInformante"));
dados.setParentesco(requisicao.getParameter("parentesco"));
dados.setNomeContato(requisicao.getParameter("nomeContato"));
dados.setTelefoneContato(requisicao.getParameter("telefoneContato"));
servico.atualizar(dados);
requisicao.getRequestDispatcher("/listarServlet").forward(requisicao, resposta);
}
@Override
protected void doPost(HttpServletRequest requisicao, HttpServletResponse resposta)
throws ServletException, IOException {
this.doGet(requisicao, resposta);
}
}
- Interface Mapper do MyBatis Define as operações de banco de dados para a entidade Pessoa, incluindo adição, seleção e atualização de registros. Ver código
package com.exemplo.mapeamento;
import com.exemplo.entidade.Pessoa;
import java.util.List;
public interface MapeamentoPessoa {
void incluir(Pessoa dados);
List<Pessoa> listarTodos();
void atualizar(Pessoa dados);
}
- Configuração XML do Mapper Arquivo de mapeamento SQL que define as instruções para as operações de persistência, utilizando dynamic SQL para atualizar campos condicionais. Ver código
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Mapeamento para a interface -->
<mapper namespace="com.exemplo.mapeamento.MapeamentoPessoa">
<insert id="incluir" parameterType="com.exemplo.entidade.Pessoa">
INSERT INTO tbl_pessoa (
codigoPessoa, dataAvaliacao, motivoAvaliacao, nome, genero, dataNascimento,
cpf, cartaoSus, etnia, escolaridade, religiao, estadoCivil,
situacaoMoradia, formaPagamento, fonteRenda, demencia, doencaMental,
doencasCronicas, quedas, desaparecimentos, engasgios, suicidios, observacoes,
nomeInformante, parentesco, nomeContato, telefoneContato
) VALUES (
#{codigoPessoa}, #{dataAvaliacao}, #{motivoAvaliacao}, #{nome}, #{genero}, #{dataNascimento},
#{cpf}, #{cartaoSus}, #{etnia}, #{escolaridade}, #{religiao}, #{estadoCivil},
#{situacaoMoradia}, #{formaPagamento}, #{fonteRenda}, #{demencia}, #{doencaMental},
#{doencasCronicas}, #{quedas}, #{desaparecimentos}, #{engasgios}, #{suicidios}, #{observacoes},
#{nomeInformante}, #{parentesco}, #{nomeContato}, #{telefoneContato}
)
</insert>
<select id="listarTodos" resultType="com.exemplo.entidade.Pessoa">
SELECT * FROM tbl_pessoa
</select>
<update id="atualizar">
UPDATE tbl_pessoa
<set>
<if test="dataAvaliacao != null and dataAvaliacao != '' ">
dataAvaliacao = #{dataAvaliacao},
</if>
<if test="motivoAvaliacao != null">
motivoAvaliacao = #{motivoAvaliacao},
</if>
<if test="nome != null and nome != '' ">
nome = #{nome},
</if>
<if test="genero != null and genero != '' ">
genero = #{genero},
</if>
<if test="dataNascimento != null and dataNascimento != '' ">
dataNascimento = #{dataNascimento},
</if>
<if test="cpf != null and cpf != '' ">
cpf = #{cpf},
</if>
<if test="cartaoSus != null and cartaoSus != '' ">
cartaoSus = #{cartaoSus},
</if>
<if test="etnia != null and etnia != '' ">
etnia = #{etnia},
</if>
<if test="escolaridade != null">
escolaridade = #{escolaridade},
</if>
<if test="religiao != null">
religiao = #{religiao},
</if>
<if test="estadoCivil != null">
estadoCivil = #{estadoCivil},
</if>
<if test="situacaoMoradia != null">
situacaoMoradia = #{situacaoMoradia},
</if>
<if test="formaPagamento != null">
formaPagamento = #{formaPagamento},
</if>
<if test="fonteRenda != null">
fonteRenda = #{fonteRenda},
</if>
<if test="demencia != null">
demencia = #{demencia},
</if>
<if test="doencaMental != null">
doencaMental = #{doencaMental},
</if>
<if test="doencasCronicas != null and doencasCronicas != '' ">
doencasCronicas = #{doencasCronicas},
</if>
<if test="quedas != null">
quedas = #{quedas},
</if>
<if test="desaparecimentos != null">
desaparecidos = #{desaparecimentos},
</if>
<if test="engasgios != null">
engasgios = #{engasgios},
</if>
<if test="suicidios != null">
suicidios = #{suicidios},
</if>
<if test="observacoes != null and observacoes != '' ">
observacoes = #{observacoes},
</if>
<if test="nomeInformante != null and nomeInformante != '' ">
nomeInformante = #{nomeInformante},
</if>
<if test="parentesco != null and parentesco != '' ">
parentesco = #{parentesco},
</if>
<if test="nomeContato != null and nomeContato != '' ">
nomeContato = #{nomeContato},
</if>
<if test="telefoneContato != null and telefoneContato != '' ">
telefoneContato = #{telefoneContato},
</if>
</set>
WHERE codigoPessoa = #{codigoPessoa};
</update>
</mapper>
A implementação showcased utiliza uma arquitetura em camadas com separação entre apresentação, lógica de negócio e persistência, facilitando a manutenção e testes do sistema.