Implementación Avanzada de @ModelAttribute en Spring MVC

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.

Etiquetas: Spring MVC ModelAttribute Java Web Spring Framework Controladores

Publicado el 7-19 23:42