Das mag den Experten in Spring
dumm klingen, aber ich muss fragen. Wie entscheiden Sie, wann Sie ModelAndView
vs. Model
verwenden sollten?
Nach allem, was ich recherchiert habe, ist die beste Antwort, die ich gefunden habe, diese . Es wurde erwähnt, dass ModelAndView
ein alter Weg ist und der Model
mit einem String
, der zurückgegeben wird, ein neuer Weg in Spring
ist.
Meine Frage ist, sollten wir die alte ModelAndView
abschätzen, nachdem wir Model
in der Hand haben? Oder gibt es Fälle, in denen Sie ModelAndView
verwenden müssen.
Weiß jemand auch, warum der Wert ModelAndView
in Model
und String
als View
geändert werden muss, und welche Vorteile ergeben sich daraus?
Ich verwende immer den Ansatz, bei dem Controller-Methoden ModelAndView
zurückgeben. Einfach, weil die Controller-Methoden dadurch etwas strenger werden. Die Methodenparameter sind jetzt streng input
-Parameter. Alle output
-bezogenen Daten sind in dem von der Methode zurückgegebenen Objekt enthalten.
Der ModelAndView
-Stil scheint bei Leuten zu schwingen, die keine Eingabeparameter auf eine Methode aktualisieren möchten. Festhalten an der Überzeugung, dass dies eine Nebenwirkung darstellen würde, ein gefährliches Muster, da Sie nicht zuverlässig vorhersagen können, was die Methode tun wird. Sie könnte Daten im zurückgegebenen Objekt zurückgeben oder alles in den Eingabeargumenten aktualisieren.
Daher bevorzugen einige Leute weiterhin ModelAndView
.
Der neue Stil mit Model
als Methodenparameter und zurückgegebener String als Ansichtsname. Scheint von einem etwas anderen Design-Ansatz ausgehen. Hier werden die Modellobjekte als eine Art Ereignisse oder Elemente betrachtet, die an mehrere Handler übergeben werden, bevor sie an die Ansicht zurückgegeben werden, in der sie wiedergegeben werden. Es erinnert mich daran, wie Ereignisse in der AWT/Swing-Welt behandelt werden. Dieses Modell ist kohärenter mit dem Ansatz, bei dem mehrere Handler auf den Model
-Objekten aufbauen können, bis sie eine Ansicht erreichen.
Am Ende des Tages scheint es also keinen eindeutigen Grund zu geben, beide Vorgehensweisen zu kritisieren oder zu fördern. Sie sollten den Stil verwenden, der Ihrer gesamten Designphilosophie besser entspricht.
Hoffe das hilft.
Einen Unterschied kann ich beim ModelAndView-Objekt feststellen, in dem Sie einen direkten Verweis auf ein Ansichtsobjekt festlegen können:
ModelAndView mav = ...
mav.setView(myView);
Wenn Sie dagegen Model und String verwenden, benötigen Sie einen View-Resolver, um den View-Namen in eine tatsächliche View aufzulösen
public String myHandler(...) {
return "myviewname"; // has to have a resolver from "myviewname" into an actual view
}
In der SEO-Perspektive können wir ModelAndView verwenden, um die 301-Umleitung anzuwenden, falls dies erforderlich ist. Dies können wir mit Model nicht erreichen.
@RequestMapping("/")
public ModelAndView AWBCOntroller() {
log.info("Tracking info");
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
return mav;
}