Conoce la estructura Spring MVC

Conoce la estructura Spring MVC

Spring MVC es un framework de desarrollo web bastante conocido, basado en el patrón de arquitectura Model-View-Controller, de ahí su abreviatura MVC.

Esta herramienta es parte del Spring Framework, la cual es una plataforma muy conocida, especialmente para quienes desarrollan en Java, porque ofrece un conjunto de componentes para simplificar el desarrollo de aplicaciones web y la estructura está preparada para separar la lógica de visualización de la lógica de control.

De esta forma se organiza el código, así como su promoción y reutilización.


Explicando los tres componentes de Spring MVC

Model es usado para almacenar datos que se mostrarán o manipularán en vistas (views) u otros componentes de la aplicación. El desarrollador puede agregar otros atributos y métodos según sea necesario para satisfacer las necesidades de su aplicación. Además, estos también se pueden pasar a vistas a través del objeto Model en los métodos de Controller.


El método exibirUser() agregará un objeto UserModel al modelo usando el método addAttribute(). El objeto se añade con el nombre user al frente, permitiendo que sea accesado en la visualización correspondiente.

View es responsable de acceder a los datos del modelo y presentarlos al usuario. Podría ser una página JSP (JavaServer Pages), un archivo HTML, un documento XML, entre otros.


La clase UserView implementará la interfaz View de Spring MVC, utilizando el método getContentType(), que define el tipo de contenido retornado por la visualización, que en este caso es text/html y el método render() responsable de entregar la visualización, recibe un mapa de atributos del modelo que contiene los datos que serán exhibidos en la visualización. En este caso, se usaron model.get("nome") y model.get("idade") para recuperar los valores correspondientes al modelo e insertarlos en el HTML generado.

El Controller es responsable de atender las solicitudes de los usuarios, procesar los datos enviados por el navegador y actualizar el modelo y la vista adecuados. Actúa como intermediario entre el modelo y la visualización, manejando la lógica empresarial y coordinando el flujo de datos.


El controlador es llamado UserController y se anota con @Controller, indicando que es un componente controlador en el contexto de Spring MVC. Utilizando el método exibirUser() se anota con @GetMapping("/user"), lo que significa que responderá a una solicitud HTTP GET para la ruta /user. Dentro de ese método fue creado un objeto UserModel, cuyoss valores fueron definidos y agregados al modelo (model) usando model.addAttribute(). Enseguida, retornamos al nombre de la visualización "user", que será entregada para mostrar los datos del modelo.

El método salvarUser() se anota @PostMapping("/user/salvar"), indicando que responderá a una solicitud HTTP POST para la ruta /user/salvar, ya que recibe los parámetros nombre y edad, usando @RequestParam con estos parámetros puede crearse um nuevo objeto UserModel. Este objeto puede ser añadido al modelo y la visualización "user" será devuelta para mostrar los datos actualizados.

Recursos adicionales de Spring MVC

En resumen, Spring MVC es un framework potente y flexible para desarrollar aplicaciones web en Java. Promueve la modularidad, la reutilización de código y la separación de preocupaciones, lo que permite a los desarrolladores crear aplicaciones web sólidas y escalables.

Resolución de URLs y mapeo

El framework permite mapear URLs para métodos específicos en los controladores, facilitando la implementación de endpoints de la API RESTful.


El controlador llamado FormController mapea URLs para métodos específicos, leyendo y anotando con @RestController, que combina las anotaciones @Controller y @ResponseBody, indicando que la clase es un controlador que retorna respuestas HTTP directamente como JSON/XML. La anotación @RequestMapping("/api/form") define el mapeo de la URL base para todas las rutas de este controlador, por lo que todos los endpoints definidos en este controlador se basarán en la URL "/api/form".

El método obterDetalhes() es mapeado para la ruta "/api/form/detalhes/{id}" usando la anotación @GetMapping. Él recibe un parámetro ({id}) y retorna detalles correspondientes al ID proporcionado.

El método criarForm() es mapeado para la ruta "/api/form/criar", usando la anotación @PostMapping. Él recibe un objeto FormDTO en la solicitud, mientras que usa la anotación @RequestBody y retorna la respuesta com un nuevo form creado.

Los métodos retornan un objeto ResponseEntity<T>, que permite especificar el estatus HTTP, los títulos y el cuerpo de la respuesta. En el código se utilizaron los métodos estáticos ok() y notFound() de la clase ResponseEntity para devolver las respuestas adecuadas con base en la lógica del controlador.

El desarrollador también puede definir rutas adicionales, mapear diferentes tipos de solicitudes HTTP (GET, POST, PUT, DELETE, etc.) y realizar la lógica necesaria para implementar su API RESTful.

Inyección de dependencia

Spring MVC aprovecha el poderoso mecanismo de inyección de dependencia de Spring Framework, lo que permite una fácil integración con otros componentes de Spring y facilita la escritura de pruebas unitarias. La inyección de dependencia permite desacoplar al controlador de la creación y gestión de sus dependencias.

Esto facilita el mantenimiento, la capacidad de prueba y la reutilización del código, además de promover la modularidad y escalabilidad de las aplicaciones. Por lo tanto, es muy importante configurar Spring correctamente para permitir la inyección de dependencias, ya que generalmente se realiza a través de la configuración del archivo de contexto Spring, donde se define la creación y configuración de los beans (componentes) de la aplicación.

Tratamiento de excepciones

Spring MVC tiene funciones integradas para manejar excepciones y errores de forma centralizada, lo que le permite personalizar la respuesta de la aplicación en caso de problemas.


La clase llamada GlobalExceptionHandler se anota con @ControllerAdvice y esta anotación indica que la clase es responsable de manejar las excepciones en toda la aplicación.

El método handleExemploException() es anotado con @ExceptionHandler(ExemploException.class) abordar específicamente las excepciones del tipo ExemploException. Dentro de este método, se creó un objeto ErrorResponse basado en la excepción detectada que devuelve una respuesta de error personalizada usando ResponseEntity. De esta manera, hay un retorno de estado HTTP 400 (Bad Request) conjuntamente con un mensaje de error.

El método handleException() se anota con @ExceptionHandler(Exception.class) y se utiliza como controlador genérico para cualquier otra excepción no manejada específicamente, devolviendo una respuesta de error estándar con un estado HTTP 500 (Internal Server Error) y un mensaje genérico de error.

La clase ErrorResponse es una clase personalizada que representa una respuesta de error.

Validación de datos

El framework ofrece soporte de validación de datos de entrada por medio de anotaciones e integración con la API de Validación de Bean de Java (JSR 380).


El controlador se llama EntityController y en el método processarFormulario() recibemos un objeto EntityForm que representa los datos enviados por el formulário. La anotación @Valid se usa para indicar a Spring que la validación deb aplicarse al objeto EntityForm. A continuación, Spring utiliza el JSR 380 para validar con base en las anotaciones presentes en la clase EntityForm.

El objeto BindingResult se usa para recolectar los resultados de la validación, que contienen información sobre los errores de validación encontrados durante el procesamiento. Verificamos si existen errores usando el método hasErrors() de BindingResult y, si hay errores, es posible abordarlos adecuadamente. Si se trata de un error de validación, simplemente devuelve la misma vista de formulario para mostrar los errores que el usuario debe corregir.


En el método exibirFormulario() que mapea la ruta GET "/entity", retorna la visualización formulario, donde el usuario puede rellenar los campos y enviar el formulario.

EntityForm es una clase que representa datos de formulario.


En esta clase se usaron algunas anotaciones de validación de la API de JSR 380, mientras que la anotación @NotBlank se usó para garantizar que el campo nombre no estuviese en blanco y la anotación @Min se usó para garantizar que el campo de edad tenga un valor mayor o igual a 18.

Al realizar la validación, Spring comprobará las anotaciones presentes en los campos de clase EntityForm y aplicará las reglas de validación correspondientes. Siempre es una buena práctica que el desarrollador verifique que la configuración del mecanismo de validación de Spring esté correctamente en el archivo de configuración de su aplicación habilitando la validación @EnableWebMvc o configurando un Validator personalizado, por ejemplo.

Integración con otros componentes del ecosistema Spring

Spring MVC puede integrarse fácilmente con otros módulos Spring como Spring Security para la autenticación y el control de acceso, el Spring Data para acceso a datos y Spring Boot para simplificar la configuración de la aplicación.


En el código arriba, la configuración de Spring Security (SecurityConfig) define las reglas de autenticación y control de acceso para diferentes URLs de la aplicacióno, como los usuarios admin y user definidos con sus correspondientes contraseñas y roles mediante autenticación en memoria.


La interfaz de repositorio (Repository) que extiende JpaRepository de Spring Data proporciona métodos de acceso a datos previamente implementados, como guardar, actualizar, eliminar y consultar registros. El desarrollador también puede agregar métodos de consulta personalizados según sus necesidades.


En la clase de punto de entrada de la aplicación anotada con @SpringBootApplication, se incluyen varias otras anotaciones como @Configuration, @EnableAutoConfiguration y @ComponentScan, que configuran automáticamente la aplicación con base en las convenciones de Spring Boot.


El desarrollador aún puede explorar la documentación de Spring para obtener más información sobre cómo integrar y utilizar estos componentes de manera efectiva en su aplicación Spring MVC.

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.