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";
}   
Était-ce utile?

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 @RequestMappingAu 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top