Question à propos de Spring MVC
@ModelAttribute
méthodes, Définition des attributs de modèle dans un contrôleur @RequestMapping
versets de méthode définissant l'attribut individuellement avec @ModelAttribute
méthodes, laquelle est considérée comme la meilleure et la plus utilisée?
Du point de vue de la conception, quelle approche est considérée comme meilleure des points suivants:
Approche 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";
}
Approche 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";
}
L'un n'est pas meilleur que l'autre. Ils ont tous deux un autre objectif.
@ModelAttribute
A plus de sens.Je dirais que l'approche 2 est meilleure car les données sont spécifiques à ce gestionnaire.
Le @ModelAttribute annotation
Sert deux objectifs selon la façon dont il est utilisé:
Au niveau de la méthode
Utilisez @ModelAttribute
Au niveau de la méthode pour fournir des données de référence pour le modèle. Les méthodes annotées @ModelAttribute sont exécutées avant la méthode de gestionnaire annotée @RequestMapping
Choisie. Ils préremplissent efficacement le modèle implicite avec des attributs spécifiques, souvent chargés à partir d'une base de données. Un tel attribut est alors déjà accessible via les paramètres de la méthode de gestionnaire annotée @ModelAttribute
Dans la méthode de gestionnaire choisie, éventuellement avec la liaison et la validation qui lui sont appliquées.
En d'autres termes; une méthode annotée avec @ModelAttribute
remplira la "clé" spécifiée dans le modèle. Cela se produit AVANT le @RequestMapping
Au niveau du paramètre de méthode
Au niveau des paramètres de méthode
Lorsque vous placez @ModelAttribute
Sur un paramètre de méthode, @ModelAttribute
Mappe un attribut de modèle au paramètre de méthode annoté spécifique. C'est ainsi que le contrôleur obtient une référence à l'objet contenant les données saisies dans le formulaire.
Exemples
Niveau de méthode
@Controller
public class MyController {
@ModelAttribute("productsList")
public Collection<Product> populateProducts() {
return this.productsService.getProducts();
}
}
Ainsi, dans l'exemple ci-dessus, "productsList
" dans le modèle est rempli avant que le @RequestMapping
Soit exécuté.
Niveau de paramètre de méthode
@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";
}
}
}
Regardez ici pour des informations détaillées avec des exemples.