web-dev-qa-db-fra.com

Quand utiliser ModelAndView vs Model au printemps?

Cela peut sembler stupide aux experts de Spring mais je dois demander. Comment décidez-vous quand utiliser ModelAndView contre Model

Après tout, j'ai recherché la meilleure réponse que j'ai trouvée est celle-ci . Il a été mentionné que la ModelAndView est une ancienne méthode et que la Model avec une String renvoyée est une nouvelle méthode dans Spring

Ma question est la suivante: allons-nous déconseiller l’ancienne ModelAndView maintenant que nous avons Model en main? Ou existe-t-il des cas pour lesquels vous devez utiliser ModelAndView?.

En outre, est-ce que quelqu'un sait pourquoi il faut changer ModelAndView en Model et String pour que View et quels sont les avantages? 

50
sheidaei

J'utilise toujours l'approche où les méthodes du contrôleur renvoient ModelAndView. Tout simplement parce que cela tend à rendre les méthodes de contrôleur un peu plus concises. Les paramètres de la méthode sont maintenant strictement des paramètres input. Et toutes les données liées à output sont contenues dans l'objet renvoyé par la méthode.

Le style ModelAndView semble résonner chez les personnes qui n'aiment pas mettre à jour les paramètres d'entrée d'une méthode. S'en tenir à la conviction que cela constituerait un effet secondaire, un schéma dangereux, car vous ne pouvez pas prédire de manière fiable ce que la méthode va faire - Elle pourrait renvoyer des données dans l'objet renvoyé ou aurait pu mettre à jour quoi que ce soit dans l'un des arguments en entrée.

Donc, certaines personnes continueront à préférer ModelAndView.

Le nouveau style avec Model comme paramètre de méthode et la chaîne renvoyée comme nom de vue. Semble provenir d'une approche de conception légèrement différente. Ici, les objets du modèle sont considérés comme une sorte d'événements ou d'éléments qui sont transmis à plusieurs gestionnaires, avant d'être renvoyés à la vue où ils sont rendus. Cela me rappelle comment les événements sont gérés dans le monde AWT/Swing. Ce modèle est plus cohérent avec l'approche où plusieurs gestionnaires pourraient s'appuyer sur les objets Model, jusqu'à atteindre une vue.

En fin de compte, il ne semble donc pas y avoir de raison valable de critiquer ou de promouvoir l'une ou l'autre de ces approches. Vous devez utiliser un style plus cohérent avec votre philosophie de conception globale.

J'espère que cela t'aides.

43
Akshay

Une différence que je peux voir est qu'avec l'objet ModelAndView, vous pouvez définir une référence directe à un objet de vue:

ModelAndView mav = ...
mav.setView(myView);

Considérant que si vous utilisez Model et String, vous avez besoin d'un résolveur de vues pour résoudre le nom de la vue en vue réelle

public String myHandler(...) {
   return "myviewname"; // has to have a resolver from "myviewname" into an actual view
}
15
gerrytan

En ce qui concerne le référencement, nous pouvons utiliser ModelAndView pour appliquer la redirection 301 si nous avons des exigences à cet égard. Nous ne pouvons pas y parvenir à l'aide de Model.

0
Shams
@RequestMapping("/")
public ModelAndView AWBCOntroller() {
    log.info("Tracking info");
    ModelAndView mav = new ModelAndView();
    mav.setViewName("index");
    return mav;

}
0
Vishnu Mari