A separação de respnosabilidades através da arquitetura em três camadas (ou multicamadas) é um padrão fundamental no desenvolvimento de aplicações corporativas Java. Este modelo divide o sistema em componentes distintos: Apresentação (View), Controle (Controller), Lógica de Negócios/Persistência (DAO) e Etnidades (Model), o que facilita a manutenção, os testes e a escalabilidade do código.
Camada de Antidade (Model)
A camada de entidade é composta por objetos Java simples (POJOs) que encapsulam os dados do domínio da aplicação. Abaixo, definimos a classe que representa as credenciais do usuário, substituindo a nomenclatura original por atributos mais semânticos.
package com.empresa.modelo;
public class Usuario {
private Long id;
private String login;
private String senha;
public Usuario() {
}
public Usuario(String login, String senha) {
this.login = login;
this.senha = senha;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
}
Camada de Acesso a Dados (DAO)
O Data Access Object (DAO) centraliza a comunicação com o banco de dados. Nesta refatoração, a lógica foi aprimorada para utilizar o padrão try-with-resources, garantindo o fechamento automático das conexões JDBC. Além disso, o método de validação agora retorna um valor booleano, eliminando a necessidade de manipular códigos de erro inteiros (como -1, 0 e 1).
package com.empresa.persistencia;
import com.empresa.modelo.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UsuarioDao {
private static final String DB_URL = "jdbc:mysql://localhost:3306/sistema_db?serverTimezone=UTC&useSSL=false";
private static final String DB_USER = "admin";
private static final String DB_PASS = "senha_segura";
public boolean autenticar(Usuario usuario) {
String sql = "SELECT COUNT(1) FROM usuarios WHERE login = ? AND senha = ?";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, usuario.getLogin());
stmt.setString(2, usuario.getSenha());
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
return rs.getInt(1) > 0;
}
}
}
} catch (ClassNotFoundException | SQLException e) {
System.err.println("Erro na camada de persistência: " + e.getMessage());
}
return false;
}
}
Camada de Controle (Controller)
O Servlet atua como o controlador da aplicação. Ele intercepta as requisições HTTP, extrai os parâmetros enviados pelo cliente, invoca a camada de persistência e roteia o fluxo de resposta. Note que o método doPost é o padrão adequado para processamento de formulários de login, em vez de delegar a requisição para o doGet.
package com.empresa.controle;
import com.empresa.modelo.Usuario;
import com.empresa.persistencia.UsuarioDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/autenticar")
public class AutenticacaoServlet extends HttpServlet {
private final UsuarioDao usuarioDao = new UsuarioDao();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String loginParam = request.getParameter("txtLogin");
String senhaParam = request.getParameter("txtSenha");
Usuario usuario = new Usuario(loginParam, senhaParam);
boolean acessoPermitido = usuarioDao.autenticar(usuario);
if (acessoPermitido) {
request.getRequestDispatcher("/dashboard.jsp").forward(request, response);
} else {
request.setAttribute("mensagemErro", "Credenciais inválidas. Tente novamente.");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
Camada de Apresentação (View)
As páginas JSP compõem a interface visual. O formulário principal captura as informações e as envia ao Servlet configurado. Uma lógica adicional foi inserida para exibir mensagens de erro de autenticação quando o redirecionamento ocorre após uma falha.
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Acesso ao Sistema</title>
</head>
<body>
<h2>Painel de Login</h2>
<% if (request.getAttribute("mensagemErro") != null) { %>
<p style="color: red;"><%= request.getAttribute("mensagemErro") %></p>
<% } %>
<form action="autenticar" method="post">
<label for="login">Usuário:</label><br>
<input type="text" id="login" name="txtLogin" required><br><br>
<label for="senha">Senha:</label><br>
<input type="password" id="senha" name="txtSenha" required><br><br>
<button type="submit">Entrar</button>
</form>
</body>
</html>
dashboard.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Área Restrita</title>
</head>
<body>
<h1>Bem-vindo ao Sistema!</h1>
<p>Sua autenticação foi processada com sucesso e você acessou a área segura.</p>
</body>
</html>