web-dev-qa-db-fra.com

Spring MVC @ModelAttribute, méthode

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";
}   
15
Kamal Kishore

L'un n'est pas meilleur que l'autre. Ils ont 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 méthode @ModelAttribute A plus de sens.
  • Parameter: Utilisez-le sur un paramètre lorsque vous souhaitez lier des données de la demande et les ajouter implicitement au modèle.

Pour répondre à votre question sur la meilleure approche

Je dirais que l'approche 2 est meilleure car les données sont spécifiques à ce gestionnaire.

14
Bart

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.

19
Ankur Singhal