El uso de Spring MVC @SessionAttributes nos ayuda a simplificar el manejo de estado a nivel de Spring MVC cuando necesitamos almacenar estado dentro de una sessión utilizando Spring MVC . La mayor parte de las veces en una aplicación web nos encontramos ante una navegación Stateless en la cual las páginas no mantienen estado . Sin embargo hay situaciones concretas como las de un carrito de la compra o acciones similares que nos vemos obligados a gestionar un estado a nivel de aplicación . Vamos a construir un ejemplo sencillo que nos ayude a entender mejor como funcionan las sesiones sobre Spring MVC. Para ello que mejor que el típico ejemplo de contador.
Acabamos de ver como usar Java equals y hashcode
package com.arquitecturajava;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
@Controller
@SessionAttributes({"contador"})
public class ContadorController {
@ModelAttribute("contador")
public int getContador() {
return 5;
}
@RequestMapping("/contador")
public String verContador() {
return "contador";
}
@RequestMapping("/contadorincrementar")
public String incrementar(Model modelo) {
int contador=(int) modelo.getAttribute("contador");
contador++;
modelo.addAttribute("contador",contador);
return "contador";
}
} Spring MVC Controller
En este caso nos encontramos ante un Controlador que se encarga de mostrar un contador en una página a través de la anotacion @ModelAttribute . Recordar que esta anotación sirva para añadir una variable al objeto modelo con el cual nosotros intercambiamos información entre el controlador y la vista.
Esta anotación tiene como ciclo de vida la propia petición que nosotros realizamos al servidor por lo tanto cada vez que invoquemos la url de /contador nos mostrará el mismo resultado. Ahora bien echemos un vistazo a la plantilla . En ella se muestra claramente el contador como un pequeño formulario que permite invocar a la URL de /contadorincrementar.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p th:text="${contador}"><p>
<form action="contadorincrementar">
<input type="submit"/>
</form>
</body>
</html> Esto hará que cuando se invoque la URL aparezca algo del siguiente estilo :
Spring MVC @SessionAttributes
Cada vez que pulsemos en el boton de enviar se invocará la URL de /incrementarcontador que incrementará en uno el contador ya que hemos definido este @ModelAttribute como scope de Session al usar @SessionAttributes({“contador}”. Esto hará que el contador se almacene en sessión y cada vez que solicitemos la página se incremente.
Cada vez que pulsamos el botón de enviar el valor se incrementa en uno.
Aprendamos a usar @SessionAttributes y @ModelAttributes en nuestras aplicaciones de Spring MVC