Article image
Wellington Silva
Wellington Silva03/03/2025 13:54
Compartilhe

Desenvolvimento Web com Java - Arquitetura e Boas Práticas

  • #Java

O desenvolvimento web com Java é uma área essencial no universo da tecnologia, permitindo a criação de aplicações robustas, seguras e escaláveis. Neste artigo, exploraremos a arquitetura MVC (Modelo-Visão-Controlador) e as boas práticas que garantem a qualidade e a manutenção eficiente das aplicações web em Java. Além disso, apresentaremos um exemplo prático de uma aplicação de gerenciamento de tarefas usando Spring Boot, ilustrando os conceitos discutidos de forma clara e acionável.

Introdução ao Desenvolvimento Web com Java

Desenvolver aplicações web com Java significa criar sistemas que operam na internet ou em redes privadas, geralmente acessados por meio de navegadores. Java é uma escolha popular entre desenvolvedores devido à sua portabilidade, segurança e à vasta comunidade de suporte que a linguagem possui. Para criar aplicações de alta qualidade, é essencial adotar uma arquitetura bem definida, como o modelo MVC, e seguir boas práticas de desenvolvimento, como injeção de dependências e testes automatizados. Esses fundamentos ajudam a construir sistemas que não apenas funcionam bem, mas também são fáceis de manter e escalar.

Arquitetura MVC no Desenvolvimento Web com Java

O modelo Modelo-Visão-Controlador (MVC) é uma das arquiteturas mais amplamente utilizadas no desenvolvimento web com Java. Ele organiza a aplicação em três componentes distintos, cada um com uma responsabilidade específica:

  • Modelo (Model): Representa os dados e a lógica de negócios da aplicação. Inclui classes que definem entidades (como uma "Tarefa" em um sistema de gerenciamento) e serviços que manipulam esses dados.
  • Visão (View): É a camada responsável pela interface do usuário, exibindo os dados do modelo de forma compreensível. Pode ser implementada com tecnologias como HTML, JSP ou Thymeleaf.
  • Controlador (Controller): Atua como um intermediário entre o modelo e a visão, processando as requisições do usuário e決定 qual visão deve ser exibida em resposta.

Benefícios do MVC

A adoção do MVC traz vantagens significativas:

  • Separação de responsabilidades: Cada componente tem uma função clara, o que facilita a manutenção e a evolução do código.
  • Reutilização de código: O modelo pode ser reutilizado em diferentes partes da aplicação ou até em outros projetos.
  • Testabilidade: A separação permite testar cada componente isoladamente, aumentando a confiabilidade do sistema.

Boas Práticas no Desenvolvimento Web com Java

Além de uma boa arquitetura, seguir boas práticas é fundamental para garantir a qualidade e a longevidade das aplicações. Aqui estão algumas das mais importantes:

  • Injeção de Dependências: Reduz o acoplamento entre os componentes da aplicação, tornando o código mais modular e fácil de testar. Frameworks como o Spring facilitam essa prática ao gerenciar as dependências automaticamente.
  • Testes Automatizados: Utilizar ferramentas como JUnit e Mockito para criar testes unitários e de integração ajuda a identificar erros rapidamente e assegura que a aplicação funcione conforme esperado.
  • Código Limpo: Escrever código claro, bem documentado e com nomes significativos melhora a legibilidade e facilita a colaboração entre equipes.

Essas práticas não apenas melhoram a qualidade do software, mas também tornam a aplicação mais escalável e fácil de manter ao longo do tempo.

Exemplo Prático: Aplicação de Gerenciamento de Tarefas

Para ilustrar como a arquitetura MVC e as boas práticas podem ser aplicadas, vamos construir uma aplicação simples de gerenciamento de tarefas usando Spring Boot (um framework popular baseado em Java) e Thymeleaf (uma engine de templates para visões dinâmicas). A aplicação permitirá listar tarefas e adicionar novas tarefas.

1. Modelo: Classe Task

A classe Task representa uma tarefa com atributos como id, título e status de conclusão.

public class Task {
private Long id;
private String title;
private boolean completed;

public Task(Long id, String title, boolean completed) {
  this.id = id;
  this.title = title;
  this.completed = completed;
}
// Getters e Setters 
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getTitle() { return title; } 
public void setTitle(String title) { this.title = title; }
public boolean isCompleted() { return completed; } 
public void setCompleted(boolean completed) { this.completed = completed; }
}

2. Serviço: TaskService

O TaskService gerencia as operações relacionadas às tarefas, como listar todas as tarefas ou adicionar uma nova.

import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;

@Service
public class TaskService {
private List<Task> tasks = new ArrayList<>();

public List<Task> getAllTasks() {
  return tasks;
}
          
public void addTask(Task task) {
  tasks.add(task);
}
}

Aqui, usamos a anotação @Service do Spring para indicar que essa classe é um serviço, permitindo a injeção de dependências.

3. Controlador: TaskController

O TaskController lida com as requisições HTTP e coordena a interação entre o modelo e a visão.

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TaskController {
private final TaskService taskService;

@Autowired
public TaskController(TaskService taskService) {
  this.taskService = taskService;
}
          
@GetMapping("/tasks")
public String listTasks(Model model) {
  model.addAttribute("tasks", taskService.getAllTasks());
  return "task-list";
}
}

A anotação @Autowired injeta automaticamente o TaskService no controlador, exemplificando a injeção de dependências.

4. Visão: task-list.html

A visão usa Thymeleaf para exibir dinamicamente a lista de tarefas.

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Lista de Tarefas</title>
</head>
<body>
<h1>Tarefas</h1>
<ul>
  <li th:each="task : ${tasks}" th:text="${task.title}"></li>
</ul>
</body>
</html>

O atributo th:each itera sobre a lista de tarefas, enquanto th:text exibe o título de cada uma.

5. Teste Automatizado

Para garantir a qualidade, criamos um teste unitário para o controlador usando JUnit e Mockito.

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(TaskController.class)
public class TaskControllerTest {
@Autowired 
private MockMvc mockMvc;

@MockBean 
private TaskService taskService;

@Test
public void testListTasks() throws Exception { 
    Task task = new Task(1L, "Fazer compras", false);
    when(taskService.getAllTasks()).thenReturn(Arrays.asList(task));
          
    mockMvc.perform(get("/tasks")) 
            .andExpect(status().isOk()) 
            .andExpect(view().name("task-list")) 
            .andExpect(model().attribute("tasks", hasSize(1)));
}
}

Esse teste valida que a requisição /tasks retorna a visão correta com a lista de tarefas esperada.

Conclusão

O desenvolvimento web com Java, quando fundamentado em uma arquitetura como o MVC e em boas práticas como injeção de dependências e testes automatizados, resulta em aplicações robustas, escaláveis e fáceis de manter. O exemplo prático de gerenciamento de tarefas demonstra como esses conceitos podem ser aplicados de maneira simples e eficaz, utilizando ferramentas modernas como Spring Boot e Thymeleaf.

Para aqueles que desejam aprofundar seus conhecimentos, recomendo os links:

Compartilhe
Comentários (0)