Conhecendo a estrutura Spring MVC

Conhecendo a estrutura Spring MVC

O Spring MVC é um framework bastante conhecido de desenvolvimento web, baseado no padrão de arquitetura Model-View-Controller, por isso a abreviação MVC.

Essa ferramenta faz parte do Spring Framework, que é uma plataforma muito conhecida, principalmente para quem desenvolve em Java, isso porque oferece um conjunto de componentes para simplificar o desenvolvimento de aplicativos web e a estrutura é preparada para separar a lógica de exibição da lógica de controle.

Dessa forma, é dada uma organização para o código, além da promoção e da reutilização de código.


Explicando os três componentes do Spring MVC

No Model são usados para armazenar os dados que serão exibidos ou manipulados nas visualizações (views) ou em outros componentes do aplicativo. O desenvolvedor pode adicionar outros atributos e métodos, conforme necessário, para atender às necessidades do seu aplicativo. Além disso, estes também podem ser passados para as visualizações por meio do objeto Model nos métodos do Controller.


O método exibirUser() vai adicionar um objeto UserModel ao modelo usando o método addAttribute(). O objeto é adicionado com o nome “user” na frente, permitindo que ele seja acessado na visualização correspondente.

A View é responsável por acessar os dados do modelo e apresentá-los ao usuário. Pode ser uma página JSP (JavaServer Pages), um arquivo HTML, um documento XML, entre outros.


A classe UserView vai implementar a interface View do Spring MVC, utilizando o método getContentType(), que define o tipo de conteúdo retornado pela visualização, que neste caso é “text/html” e o método render() que é responsável por entregar a visualização, recebe um mapa de atributos do modelo, que contém os dados a serem exibidos na visualização. Neste caso, foi usado model.get("nome") e model.get("idade") para recuperar os valores correspondentes do modelo e inserir no HTML gerado.

O Controller é responsável por lidar com as solicitações do usuário, processar os dados enviados pelo navegador e atualizar o modelo e a visualização apropriados. Ele atua como intermediário entre o modelo e a visualização, lidando com a lógica de negócios e coordenando o fluxo de dados.


O controlador é chamado UserController e é anotado com @Controller, indicando que é um componente controlador no contexto do Spring MVC. Utilizando o método exibirUser() é anotado com @GetMapping("/user"), o que significa que ele responderá a uma solicitação HTTP GET para a rota /user. Dentro desse método foi criado um objeto UserModel, seus valores foram definidos e adicionados ao modelo (model) usando model.addAttribute(). Em seguida, retornamos ao nome da visualização "user", que será entregue para exibir os dados do modelo.

O método salvarUser() é anotado com @PostMapping("/user/salvar"), indicando que ele responderá a uma solicitação HTTP POST para a rota /user/salvar, já que ele recebe os parâmetros nome e idade, usando @RequestParam e com estes parâmetros pode ser criado um novo objeto UserModel. Este objeto pode ser adicionado ao modelo e a visualização "user" será retornada para exibir os dados atualizados.

Recursos adicionais do Spring MVC

Em resumo, o Spring MVC é um framework poderoso e flexível para o desenvolvimento de aplicativos web em Java. Ele promove a modularidade, a reutilização de código e a separação de preocupações, permitindo que os desenvolvedores construam aplicativos web robustos e escaláveis.

Resolução de URLs e mapeamento

O framework ainda permite mapear URLs para métodos específicos nos controladores, facilitando a implementação de endpoints da API RESTful.


O controlador chamado FormController mapeia URLs para métodos específicos, ele lê e anota com @RestController, que combina as anotações @Controller e @ResponseBody, indicando que a classe é um controlador que retorna respostas HTTP diretamente como JSON/XML. A anotação @RequestMapping("/api/form") define o mapeamento da URL base para todas as rotas deste controlador, então todos os endpoints definidos neste controlador serão baseados na URL "/api/form".

O método obterDetalhes() é mapeado para a rota "/api/form/detalhes/{id}" usando a anotação @GetMapping. Ele recebe um parâmetro ({id}) e retorna os detalhes correspondentes ao ID fornecido.

O método criarForm() é mapeado para a rota "/api/form/criar", usando a anotação @PostMapping. Ele recebe um objeto FormDTO na solicitação, enquanto usa a anotação @RequestBody e retorna a resposta com um novo form criado.

Os métodos retornam um objeto ResponseEntity<T>, que permite especificar o status HTTP, os cabeçalhos e o corpo da resposta. No código foram utilizados os métodos estáticos ok() e notFound() da classe ResponseEntity para retornar as respostas adequadas com base na lógica do controlador.

O desenvolvedor também pode definir rotas adicionais, mapear diferentes tipos de solicitações HTTP (GET, POST, PUT, DELETE, etc.) e realizar a lógica necessária para implementar sua API RESTful.

Injeção de dependência

O Spring MVC aproveita o poderoso mecanismo de injeção de dependência do Spring Framework, que permite a fácil integração com outros componentes do Spring e facilita a escrita de testes unitários. A injeção de dependência permite que o controlador seja desacoplado da criação e do gerenciamento de suas dependências.

Isso facilita a manutenção, testabilidade e reutilização do código, além de promover a modularidade e a escalabilidade do aplicativo. Sendo assim, é  muito importante configurar o Spring corretamente para permitir a injeção de dependência, pois geralmente é feito por meio da configuração do arquivo de contexto do Spring, onde você define a criação e configuração dos beans (componentes) da aplicação.

Tratamento de exceções

O Spring MVC possui recursos embutidos para lidar com exceções e erros de forma centralizada, permitindo que você personalize a resposta do aplicativo em caso de problemas.


A classe chamada GlobalExceptionHandler é anotada com @ControllerAdvice e essa anotação indica que a classe é responsável por tratar exceções em todo o aplicativo.

O método handleExemploException() é anotado com @ExceptionHandler(ExemploException.class) para tratar especificamente com exceções do tipo ExemploException. Dentro desse método, foi criado um objeto ErrorResponse com base na exceção capturada que retorna uma resposta de erro personalizada usando ResponseEntity. Dessa forma, há um retorno de status HTTP 400 (Bad Request) juntamente com uma mensagem de erro descritiva.

O método handleException() é anotado com @ExceptionHandler(Exception.class) e é usado como um tratador genérico para qualquer outra exceção não tratada especificamente, retornando uma resposta de erro padrão com um status HTTP 500 (Internal Server Error) e uma mensagem genérica de erro.

A classe ErrorResponse é uma classe personalizada que representa uma resposta de erro.

Validação de dados

O framework oferece suporte à validação de dados de entrada por meio de anotações e integração com a API de Validação do Bean do Java (JSR 380).


O controlador é chamado EntityController e no método processarFormulario(), recebemos um objeto EntityForm que representa os dados enviados pelo formulário, a anotação @Valid é usada para indicar ao Spring que a validação deve ser aplicada ao objeto EntityForm. Em seguida, o Spring utiliza a JSR 380 para realizar a validação com base nas anotações presentes na classe EntityForm.

O objeto BindingResult é usado para coletar os resultados da validação, nele contém informações sobre os erros de validação encontrados durante o processamento. Verificamos se existem erros usando o método hasErrors() do BindingResult, e caso haja erros é possível lidar com eles adequadamente. Se for erro de validação, é só retornar a mesma visualização do formulário para exibir os erros para o usuário corrigir.


No método exibirFormulario() que mapeia a rota GET "/entity", retorna a visualização "formulario", onde o usuário pode preencher os campos e enviar o formulário.

EntityForm é uma classe que representa os dados do formulário.


Nessa classe foram usadas algumas anotações de validação da API de JSR 380, a anotação @NotBlank foi usada para garantir que o campo nome não estivesse em branco e a anotação @Min foi usada para garantir que o campo idade tenha um valor maior ou igual a 18.

Ao realizar a validação, o Spring irá verificar as anotações presentes nos campos da classe EntityForm e aplicar as regras de validação correspondentes. É sempre uma boa prática que o desenvolvedor verifique se as configurações do mecanismo de validação do Spring estão corretamente no arquivo de configuração do seu aplicativo, habilitando a validação usando @EnableWebMvc ou configurando um Validator personalizado, por exemplo.

Integração com outros componentes do ecossistema Spring

O Spring MVC pode ser facilmente integrado com outros módulos do Spring, como o Spring Security para autenticação e controle de acesso, o Spring Data para acesso a dados e o Spring Boot para simplificar a configuração do aplicativo.


Neste código acima, a configuração do Spring Security (SecurityConfig) é quem define as regras de autenticação e controle de acesso para diferentes URLs do aplicativo, como os usuários "admin" e "user" que são definidos com suas senhas e funções correspondentes, usando a autenticação em memória.


A interface de repositório (Repository) que estende JpaRepository do Spring Data, fornece métodos de acesso a dados pré-implementados, como salvar, atualizar, excluir e consultar registros. O desenvolvedor também pode adicionar métodos personalizados de consulta, de acordo com suas necessidades.


Na classe de ponto de entrada da Aplicação anotada com @SpringBootApplication, estão inclusas várias outras anotações como @Configuration, @EnableAutoConfiguration e @ComponentScan, que configuram automaticamente o aplicativo com base nas convenções do Spring Boot.


O desenvolvedor ainda pode explorar a documentação do Spring para obter mais informações sobre como integrar e utilizar esses componentes de forma eficaz no seu aplicativo Spring MVC.

💡
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.