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.