Spring MVC es quizás el framework Web más utilizado en el mundo Java y nos permite crear aplicaciones sobre modelo MVC que generen páginas HTML sencillas en las cuales nosotros podamos cargar los contenidos que necesitemos de forma sencilla pudiendo integrarse con otras tecnologías como jQuery , React o Vue a la hora de generar aplicaciones modernas y flexibles.
Spring MVC y Spring Boot
Para poder hoy en día desarrollar una aplicación sobre Spring MVC es suficiente con descargarnos un proyecto de Spring Boot que contenga dos de las dependencias más clásicas como Starters
- Spring Web
- Thymeleaf
Al tratarse de un framework MVC trabaja sobre todo con el concepto de Controlador Frontal (FrontController) que es el encargado de soportar todas las peticiones Web y redirigirlas a los componentes que sean necesarios . En este caso el controlador de Spring se denomina ServletDispatcher y viene configurado por defecto por Spring Boot.
Como podemos ver existe un único Servlet que recibe todas las peticiones (GET,POST etc) y según la información que recibe delega en el m´étodo adecuado de cada uno de los controladores. Vamos a ver un ejemplo inicial de como realizar estas operaciones . Lo primero que tenemos es que construir un proyecto de Spring Boot
adecuado que ejecuta la petición y devolverá unos resultados u otros .Spring MVC se apoya en este concepto.Vamos a montar como punto de partida una aplicación con Spring MVC que realice estas operaciones tan sencillas (Lista y Formulario). Para ello lo primero que necesitaremos es definir unas dependencias a nivel de Maven (pom.xml) con las librerias de Spring necesarias.
Spring MVC y Pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.arquitecturajava</groupId> <artifactId>springweb</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springweb</name> <description>Ejemplo Spring Web</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Una vez configurado todo correctamente nos encontraremos en una situación en la que tenemos una aplicación de Spring Boot prácticamente vacía . Es momento de generar un objeto de negocio y generar una lista de Items con él para poner a funcionar nuestro ejemplo de HolaMundo.
package com.arquitecturajava.springweb; public class Persona { private String nombre; private String apellidos; private int edad; public Persona(String nombre, String apellidos, int edad) { super(); this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } }
Acabamos de construir la clase .Es momento de diseñar el controlador que se encargará de mostrarnos un listado de Personas en una página html diseñada con el motor de plantillas de thymeleaf.
package com.arquitecturajava.springweb; import java.util.Arrays; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @Controller public class PersonaController { @RequestMapping("/lista") public String lista(Model modelo) { Persona p1= new Persona("pedro","perez",20); Persona p2= new Persona("ana","gomez",30); Persona p3= new Persona("gema","alvarez",40); List<Persona> personas= Arrays.asList(p1,p2,p3); modelo.addAttribute("personas", personas); return "lista"; } }
PersonaController y su funcionamiento
En este caso el controlador que estamos utilizando se encarga de mapear una URL de respuesta con la anotación @RequestMapping esta anotación liga un método de un controlador de Spring con una URL que un cliente necesite . En este caso la url de /lista queda mapeada a la ejecución del método lista del Controlador Persona.
Una vez tenemos claro cómo funcionan los controladores que hemos definido es momento de ver el contenido de los ficheros html que se van a encontrar en la carpeta de templates del proyecto de Spring Boot.
Nos queda por ver el código fuente de la plantilla que genera la lista:
<html xmlns:th="http://www.thymeleaf.org"> <body> <table> <tr th:each="persona: ${personas}"> <td th:text="${persona.nombre}" /> <td th:text="${persona.apellidos}" /> <td th:text="${persona.edad}" /> </tr> </table> </body> </html>
Realizadas todas estas operaciones ya tenemos una aplicación de Spring MVC corriendo sobre Spring Boot de forma sencilla.
Cómo me curo del TLP?
Y el siguiente articulo donde lo puedo ver?
Al final no hubo siguiente lo que hay es una categoria de spring mvc 🙂
gracias maestro!!
de nada 🙂
Amigos Framework JSF es un Framework anticuado que ya no se utiliza la verdad no comprendo por que se esta utilizando este framework
Porque sigue siendo el standard de Java , y aunque este anticuado en parte , los standares pesan
esa mamada!
Hola Cecilio, felicitaciones por tu página, es muy interesante la acabo de encontrar y me ayudado muchísimo. Quería preguntar algo, estoy empezando un proyecto web con java que posiblemente deba verse en Internet masiva mente y seguramente en dispositivos móviles con algún API Rest para el Backend. Si es verdad no tengo la experiencia suficiente en esto pero he usado ya JSF, Primefaces hasta Richfaces para proyectos puntuales que se ven en una intranet, pero ojeando por ahí he visto que se nombra mucho a Spring framework, la verdad aun no tengo mucho conocimiento de el mas que usa un… Read more »
Hoy por hoy Spring y Spring MVC son standares 🙂 yo te recomendaría abordarlos 😉
[…] Otros artículos relacionados: JAX-RS , Spring Responsabilidades, Spring MVC […]
[…] artículos relacionados:Spring AOP y Aspectos , Spring MVC , Thymeleaf , un motor de […]
[…] Otros artículos relacionados: PropertiesPlaceHolder , SpringConfiguration , Spring MVC […]
[…] artículos relacionados: Modelo MVC cliente y servidor , Introducción a Spring MVC , Spring […]
[…] artículos relacionados: Introducción Spring MVC , Spring MVC […]
[…] artículos relacionados : Introducción a Spring MVC , EJB vs Spring , Spring Framework y […]
[…] artículos relacionados : Spring MVC Configuración , Spring MVC Anotaciones ,Spring MVC Model […]
[…] Otros artículos relacionados: Spark Web Microframework , Introducción a Spring MVC […]
[…] artículos relacionados: Introducción a Spring MVC ,Spring MVC Bean […]
[…] artículos relacionados : Spring MVC Configuración , JSF vs Spring […]
[…] artículos relacionados: Spring MVC Configuración , Spring […]
[…] artículos relacionados: JSF y HTML5 , Spring MVC , […]
[…] entrada Spring MVC Configuración (I) aparece primero en Arquitectura […]
Buen dia Cecilio,
Recomendarias Spring MVC para una aplicación de Escritorio (swing).
Eso ya es un tema bastante distinto. Normalmente las aplicaciones de escritorio tienen otro tipo de requerimientos .Por ejemplo es muy habitual que sean muy muy dinamicas es decir … cargo un desplegable se carga otro directamente .Son cosas que se pueden hacer via AJAX con spring mvc o incluso con JSF .Pero no es lo mismo . Mi recomendación es … si uno quiere migrar su aplicación de escritorio lo que resulte mas encajable sea JSF en cuando a capacidades o algo como GWT. Esta también JavaFX pero lo sigo viendo prematuro.
Como siempre muchas gracias por tus aportaciones y perdona si no hago la pregunta donde debo. Estoy leyendo este articulo e intentando desplegarlo pero me da el siguiente error y no consigo solucionarlo. ¿Alguna idea de por que me da lo siguiente? GRAVE: El Servlet.service() para el servlet [springmvc] en el contexto con ruta [/spring-mvc] lanzó la excepción [No adapter for handler [com.cgf.ListaController@37adb467]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler] con causa raíz javax.servlet.ServletException: No adapter for handler [com.cgf.ListaController@37adb467]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1128) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:903)… Read more »
Disculpa,
Googleando vi que me faltaba añadir la interfaz controller a mis clases.
Muchas gracias por compartir todo este conocimiento
De nada 🙂
Buen artículo.
Me ha resultado curioso el análisis al que linkas. Parece que los que mejor parados salen son los que menos cuota tienen. Yo últimamente he cogido bastante experiencia con gwt y la verdad es que es bastante satisfactorio. Tienes alguna opinión formada respecto a Grails, Vaadin y su futuro?
Un saludo y felicidades por el blog
Grails me parece que tiene mucho futuro ya que se nutre de la comunidad de Ruby que es una comunidad con grandes ideas. En cuanto a Vaadin no lo veo tan claro tendra su hueco pero no creo que vaya a ser nada que despegue simplemente tendrá su cuota
Gracias por la respuesta. Actualmente yo estoy mirándome Vaadin, como tengo conocimientos de GWT para mi es un paso natural. Una de las cosas que mas me llama la atención es que al ser puro java puedes utilizar otros frameworks como grails o play y quiero ver cuanto partido se le puede sacar a estas combinaciones. Aprovecho para compartir la siguiente parte del análisis, mas interesante si cabe: http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/ En ella te orientan a elegir un framework en función del tipo de proyecto en el que trabajas. Es curioso que en uno de sus videopodcast preguntasen cual iba a ser… Read more »
Entiendo que para ti sea un paso natural si usas GWT . Otra cosa que aprovecho a comentar es la siguiente . Cuando uno usa un framework siempre hay muchas opciones . Pero una de las cosas mas importantes a la hora de tomar la decisión final es . ¿Hay alguna empresa solida detras? .A mi en mas de una ocasión me ha pasado que ha habido frameworks que eran originales pero que no tenian alguien grande detras …y simplemente con el tiempo se abandonaron . Con Vaadin no te pasara 🙂