Spring MVC y Thymeleaf

MVC es un patron de diseño cuyas siglas significan Model-View-Controller. La base de este patrón de diseño es dividir "el rol" de nuestros componentes en tres, o lo que es lo mismo, separar la lógica de negocio, de la capa de presentación y la capa de acceso a datos.

Spring MVC es una librería de Spring que implementa este patrón y conecta nuestros componentes a la web. Spring MVC divide los roles de la siguiente manera:
  • Plantillas HTML: las vistas. Cada una representa una pantalla diferente.
  • Spring beans: los controladores. Usaremos la anotación @Controller. Los métodos de estos controladores son los que deciden que plantillas usar, asi como rellenarlos con datos del Modelo.
  • Objetos Model: el modelo. Cada metodo del Controlador puede contener opcionalmente un Modelo como parametro, y al leer y cambiar los datos que contiene, el Controlador puede leer los datos enviados por el usuario y enviarlos a la plantilla con esos cambios.
Mientras que Thymeleaf es un engine de plantillas HTML, que serán las páginas que presentemos a los usuarios después de rellenarla con los datos. En esta URL puedes encontrar toda la información sobre ello https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html

Un ejemplo sencillo:

Vista: platilla "home.html" en src/main/resources/templates <h1 th:text="${welcomeMessage}">Hello, homepage!</h1>
Controlador:@RequestMapping("/home") public String getHomePage(Model model) { model.addAttribute("welcomeMessage", "Hi Manu"); return "home"; }

Envio de datos desde el FE (Thymeleaf) al BE (Controllers)

Cada formulario tiene un POJO (Plain Old Java Object - Objeto simple). Esta clase contendrá los datos introducidos por el usuario en el formulario y será enviado al Controlador cuando se haga submit del formulario. Spring crea este objeto cada vez que recibe un request, y se lo pasa al método del controlador que nosotros hayamos definido para que se encargue de ese request. El controlador devolvera una cadena que representara el template a utilizar por Spring, y proporcionara todos los datos que el template pueda necesitar para su renderizado. Pero también tratará los datos recibidos en el formulario.

Ejemplo: <form th:object="${newMessage}" th:action="@{/home}" action="#" method="POST"> <input th:field="*{text}" type="text"> <input type="submit"> </form>
Donde el objeto es newMessage, y text es un atributo de este objeto. No es necesario hacer ${newMessage.text}. Por otro lado, el th:action reemplazara el action="#".

Toca el turno del Controlador para este ejemplo: ... @GetMapping("/home") public String getHomePage(@ModelAttribute("newMessage") MessageForm newMessage, Model model) { model.addAttribute("greetings", this.messageListService.getMessages()); return "home"; } @PostMapping("/home") public String addMessage(@ModelAttribute("newMessage") MessageForm messageForm, Model model) { messageListService.addMessage(messageForm.getText()); model.addAttribute("greetings", messageListService.getMessages()); messageForm.setText(""); return "home"; } ...

Comentarios

Entradas populares de este blog

Django REST framework

Envío de checkboxes o selector multiple por AJAX con jQuery

Django: Modelos