Méthode Spring MVC @ModelAttribute
-
20-12-2019 - |
Question
Question sur Spring MVC
@ModelAttribute
méthodes, définition des attributs de modèle dans un contrôleur @RequestMapping
méthode versets 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 la meilleure parmi les éléments 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";
}
La solution
L'un n'est pas meilleur que l'autre.Ils servent tous deux un autre objectif.
- Méthode: Si vous avez besoin que le modèle d'un contrôleur particulier soit toujours rempli avec certains attributs, le niveau de la méthode
@ModelAttribute
A plus de sens. - Paramètre: Utilisez-le sur un paramètre lorsque vous souhaitez lier les données de la requête et les ajouter implicitement au modèle.
Pour répondre à votre question sur la meilleure approche
Je dirais que l'approche 2 est meilleure puisque les données sont spécifiques à ce gestionnaire.
Autres conseils
Le @ModelAttribute annotation
répond à deux objectifs selon la manière dont il est utilisé :
Au niveau Méthode
Utiliser @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 le choix @RequestMapping
méthode de gestionnaire annotée.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 @ModelAttribute
paramètres de méthode de gestionnaire annotés dans la méthode de gestionnaire choisie, potentiellement avec une liaison et une validation qui lui sont appliquées.
Autrement dit;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 des paramètres de méthode
Au niveau des paramètres de méthode
Quand tu places @ModelAttribute
sur un paramètre de méthode, @ModelAttribute
mappe un attribut de modèle au paramètre de méthode spécifique et annoté.C'est ainsi que le responsable du traitement 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 renseigné avant le @RequestMapping
est effectuée.
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";
}
}
}
Regarder ici pour des informations détaillées avec des exemples.