La anotación @ModelAttribute de Spring vincula parámetros de solicitud a objetos del modelo. Su único atributo value define el nombre del atributo en el modelo.
Nota: Los métodos con esta enotación se ejecutan entes de cada método del controlador. Úsala con precaución en controladores con múltiples endpoints.
Ejemplo 1: Retorno de tipo específico con nombre personalizado
Vista formulario1.jsp:
<form action="inicio1" method="post">
<label>Usuario:</label>
<input type="text" name="nombreUsuario">
<input type="submit">
</form>
Controlador:
@Controller
public class ControladorModelo1 {
@ModelAttribute("usuario")
public String asignarUsuario(@RequestParam("nombreUsuario") String nombre) {
return nombre;
}
@RequestMapping("/inicio1")
public String procesar() {
return "vistaResultado1";
}
}
Vista de resultado (vistaResultado1.jsp):
${requestScope.usuario}
Ejemplo 2: Método void con inyección de Model
Vista formulario2.jsp:
<form action="inicio2" method="post">
<label>Usuario:</label>
<input type="text" name="nombreUsuario">
<label>Clave:</label>
<input type="password" name="claveAcceso">
</form>
Controlador:
@Controller
public class ControladorModelo2 {
@ModelAttribute
public void cargarModelo(
@RequestParam("nombreUsuario") String usuario,
@RequestParam("claveAcceso") String clave,
Model modelo) {
modelo.addAttribute("usuario", usuario);
modelo.addAttribute("clave", clave);
}
@RequestMapping("/inicio2")
public String procesar() {
return "vistaResultado2";
}
}
Ejemplo 3: Retorno de objeto complejo
Controlador con repositorio simulado:
@Controller
public class ControladorModelo3 {
private final List<Usuario> usuarios = Arrays.asList(
new Usuario("user1", "secreto1"),
new Usuario("admin", "admin123")
);
@ModelAttribute
public Usuario obtenerUsuario(
@RequestParam String nombreUsuario,
@RequestParam String claveAcceso) {
return usuarios.stream()
.filter(u -> u.getNombre().equals(nombreUsuario) && u.getClave().equals(claveAcceso))
.findFirst()
.orElse(null);
}
@RequestMapping("/inicio3")
public String procesar() {
return "vistaResultado3";
}
}
Vista de resultado (vistaResultado3.jsp):
${requestScope.usuario.nombre}
Ejemplo 4: Combinación con @RequestMapping
Controlador:
@Controller
public class ControladorModelo4 {
@RequestMapping("/inicio4")
@ModelAttribute("identificador")
public String metodoCombinado() {
return "supervisor";
}
}
Ejemplo 5: Anotación en parámetros
Controlador:
@Controller
public class ControladorModelo5 {
@ModelAttribute("usuario")
public Usuario crearUsuario(
@RequestParam String nombreUsuario,
@RequestParam String claveAcceso) {
return new Usuario(nombreUsuario, claveAcceso);
}
@RequestMapping("/inicio5")
public String actualizarUsuario(@ModelAttribute("usuario") Usuario user) {
user.setNombre("AdministradorModificado");
return "vistaResultado5";
}
}
Cada enfoque ofrece flexibliidad para diferentes escenarios de vinculación de datos en aplicaciones Spring MVC.