mvc multiple formulario form ejemplo docs attribute advice spring-mvc modelattribute

spring-mvc - multiple - spring form docs



Método Spring MVC @ModelAttribute (2)

Pregunta sobre los métodos de Spring MVC @ModelAttribute , Establecer atributos de modelo en un controlador @RequestMapping Método @ModelAttribute establecer el atributo individualmente con los métodos @ModelAttribute , ¿cuál se considera mejor y se usa más?

Desde el punto de vista del diseño, qué enfoque se considera mejor a partir de lo siguiente:

Enfoque 1

@ModelAttribute("message") public String addMessage(@PathVariable("userName") String userName, ModelMap model) { LOGGER.info("addMessage - " + userName); return "Spring 3 MVC Hello World - " + userName; } @RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET) public String printWelcome(@PathVariable("userName") String userName, ModelMap model) { LOGGER.info("printWelcome - " + userName); return "hello"; }

Enfoque 2

@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET) public String printWelcome(@PathVariable("userName") String userName, ModelMap model) { LOGGER.info("printWelcome - " + userName); model.addAttribute("message", "Spring 3 MVC Hello World - " + userName); return "hello"; }


La @ModelAttribute annotation tiene dos propósitos según cómo se use:

En el nivel de Método

Use @ModelAttribute en el nivel del método para proporcionar datos de referencia para el modelo. @ModelAttribute los métodos anotados se ejecutan antes del método del controlador anotado @RequestMapping . Prellenan de manera efectiva el modelo implícito con atributos específicos, a menudo cargados desde una base de datos. Tal atributo ya se puede acceder a través de los parámetros del método del controlador anotado @ModelAttribute en el método del controlador elegido, potencialmente con la vinculación y la validación aplicadas al mismo.

En otras palabras; un método anotado con @ModelAttribute rellenará la "clave" especificada en el modelo. Esto sucede ANTES del @RequestMapping At Method Parámetro

En el nivel de parámetro de método

Cuando coloca @ModelAttribute en un parámetro de método, @ModelAttribute asigna un atributo de modelo al parámetro de método anotado específico. Así es como el controlador obtiene una referencia al objeto que contiene los datos ingresados ​​en el formulario.

Ejemplos

Nivel de método

@Controller public class MyController { @ModelAttribute("productsList") public Collection<Product> populateProducts() { return this.productsService.getProducts(); } }

Entonces, en el ejemplo anterior, "lista de productsList " en el Modelo se completa antes de que se realice la @RequestMapping .

Nivel de parámetro de método

@Controller public class MyController { @RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("product") Product myProduct, BindingResult result, SessionStatus status) { new ProductValidator().validate(myProduct, result); if (result.hasErrors()) { return "productForm"; } else { this.productsService.saveProduct(myProduct); status.setComplete(); return "productSaved"; } } }

Mire aquí para obtener información detallada con ejemplos.


Uno no es mejor que el otro. Ambos sirven a otro propósito.

  • Método: si necesita que el modelo para un controlador en particular esté siempre poblado con ciertos atributos, el nivel de método @ModelAttribute tiene más sentido.
  • Parámetro: utilícelo en un parámetro cuando desee vincular datos de la solicitud y agréguelos al modelo implícitamente.

Para responder a su pregunta sobre el mejor enfoque

Yo diría que el enfoque 2 es mejor, ya que los datos son específicos de ese controlador.