Implementação de Funcionalidade de Atualização com Java Web e MyBatis

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.

  1. 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>

  1. 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);
    }
}

  1. 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);
    }
}

  1. 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);
}

  1. 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.

Tags: java Servlets jsp MyBatis desenvolvimento-web

Publicado em 10-13 16:10