Spring MVC: erklären Sie bitte den Unterschied zwischen @RequestParam und @ModelAttribute
Ich bin neu in Spring MVC. Helfen Sie mir bitte entpacken Sie die Dokumentation.
Dokumentation
Spring MVC Dokumentation Staaten (Hervorhebung von mir):
-
@ModelAttribute
auf eine Methode argument gibt das argument abgerufen werden sollen, aus dem Modell. Wenn nicht in dem Modell, das argument muss instantiiert werden und erst dann dem Modell Hinzugefügt. Einmal vorhanden in dem Modell, das argument der Felder sollte ausgefüllt werden von allen request-Parametern, die haben den passenden Namen. Die WebDataBinder Klasse matches Anfrage parameter-Namen — inklusive query-string-Parameter und die form-Felder — Modell Attribut-Felder nach Namen. -
@RequestParam
bindet request-Parameter, um einen parameter einer Methode in Ihrer Steuerung.
Haftungsausschluss /Klär -
Ich weiß, dass @ModelAttribute
und @RequestParam
sind nicht die gleiche Sache, die sich nicht gegenseitig ausschließen, führen Sie nicht die gleiche Rolle, und können gleichzeitig verwendet werden, wie in diese Frage - in der Tat @RequestParam
können verwendet werden, um füllen Sie Felder von @ModelAttribute
. Meine Frage ist eher darauf ausgerichtet, die Differenz zwischen Ihrem Innenleben.
Frage:
Was ist der Unterschied zwischen @ModelAttribute
(auf eine Methode argument, nicht-Methode) und @RequestParam
? Speziell:
- Quelle: Tun
@RequestParam
und@ModelAttribute
haben die gleiche Quelle
Informationen /Bevölkerung, d.h. Anfrage-Parameter in der URL die geliefert wurde, als Elemente einer form /ModellPOST
ed? - Verwendung: Ist es richtig, daß Variablen abgerufen mit
@RequestParam
weggeworfen werden (es sei denn, bestanden in einem Modell), während die Variablen abgerufen mit@ModelAttribute
werden automatisch eingespeist in das Modell zurückgegeben werden?
Oder in sehr einfachen Codierung Beispiele, was ist die wirkliche Arbeit den Unterschied zwischen diesen beiden Beispielen?
Beispiel 1: @RequestParam
:
//foo and bar are thrown away, and are just used (e.g.) to control flow?
@RequestMapping(method = RequestMethod.POST)
public String testFooBar(@RequestParam("foo") String foo,
@RequestParam("bar") String bar, ModelMap model) {
try {
doStuff(foo, bar);
}
//other code
}
Beispiel 2: @ModelAttribute
:
//FOOBAR CLASS
//Fields could of course be explicitly populated from parameters by @RequestParam
public class FooBar{
private String foo;
private String bar;
//plus set() and get() methods
}
//CONTROLLER
//Foo and Bar become part of the model to be returned for the next view?
@RequestMapping(method = RequestMethod.POST)
public String setupForm(@ModelAttribute("fooBar") FooBar foobar) {
String foo = fooBar.getFoo();
String bar = fooBar.getBar();
try {
doStuff(foo, bar);
}
//other code
}
Mein Aktuelles Verständnis:
@ModelAttribute
und @RequestParam
beide zu befragen, der request-Parameter für die Informationen, aber diese Informationen anders:
-
@RequestParam
nur füllt stand-alone-Variablen (kann natürlich sein, Felder in einem@ModelAttribute
Klasse). Diese Variablen werden weggeworfen, wenn der Controller fertig ist, es sei denn, Sie wurden eingespeist in das Modell ein. -
@ModelAttribute
füllt die Felder einer Klasse, die füllt dann ein Attribut des Modells werden zurück an die view
Ist das richtig?
InformationsquelleAutor der Frage Lydia Ralph | 2015-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwechseln Sie nicht das Wort "Modell" mit der Sitzung. Der http-Kommunikation ist in der Regel:
HTTP.GET
-, server-Antwort, dannHTTP.POST
. Wenn Sie die@ModelAttribute
annotation im Einsatz sind Sie immer konstruieren eine Instanz, was haben Sie kommentiert, das ist, was macht Sie glauben, dass "feeding Dinge, um das Modell' machen kann, Variablen-stick um. Das ist nicht richtig, sobald derHttpServletRequest
beendet hat, diese Variablen sollten nicht länger ein Teil des browser - /server-Gespräch, es sei denn, Sie haben gespeichert wurden, in einer Sitzung.Ja! Um korrekt zu sein,
@ModelAttribute
sagt Feder, um die Standard-web-Daten Bindemittel zum füllen einer Instanz von etwas, das mit Daten aus derHttpServletRequest
. Wahl weitergeben dieser Daten an die view ist der Programmierer. Wenn Sie eine Methode annotiert mit@ModelAttribute
es wird jedesmal aufgerufen, wenn der code trifft, servlet. Wenn Sie@ModelAttribute
als eine der Methode die Parameter, wir reden hier über ein Http-Formular-Daten-Bindung.Aufrufen
@RequestParam
ist eine Abkürzung für die Aussagerequest.getParameter("foo")
; unter der Haube, JavaHttpServletRequest
können Sie Werte aus dem request-Objekt, indem Sie eine Taste->Wert Aussehen. Der zurückgegebene Wert ist vom Typ Object. Dies ist, was würden Sie geben, eine Menge, wenn Sie nicht mit Spring in einer web-Anwendung.Frühjahr, dann nimmt diese Abstraktion einen Schritt weiter, wenn Sie die Anwendung starten
@ModelAttribute
. Diese annotation beschäftigt das Konzept der Datenbindung. Das Ziel der Datenbindung ist, dass der code in Ihr controller nicht nennenrequest.getParameter("foo1")
für jedes form-element. Stellen Sie sich vor Sie haben ein web-Formular mit 5 Feldern. Ohne Daten-Bindung hat der Programmierer manuell abrufen, und überprüfen Sie bei jedem dieser Felder. Der Programmierer muss sicherstellen, dass die Anforderung enthält die Eigenschaft, dass der Wert der Eigenschaft vorhanden ist, und dass der Wert der Eigenschaft ist der Art erwartet, dass für jedes Feld. Mit@ModelAttribute
sagt Frühling zu tun, diese Arbeit für Sie.Wenn Sie versehen eine Methode im controller mit
@ModelAttribute("fooBar") FooBar fooBar
Eine Instanz vonFooBar
wird immer konstruiert werden, die von Frühling und geliefert, um Ihre Methode. Wo die Daten die Bindung ins Spiel kommt, ist, wenn diese annotation verwendet wird, in einer Methode die Parameter; Frühling sieht am Beispiel vonHttpServletRequest
und schaut, ob es passen die Daten in der Anfrage an die richtige Eigenschaft auf eine Instanz vonFooBar
. Diese basiert auf der java-properties-convention, wo Sie ein Feld wiefoo
und öffentliche Getter und setter genanntgetFoo
undsetFoo
. Dies mag Magie, aber wenn Sie zu brechen, convention, Spring-data binding würde aufhören zu arbeiten, denn es wäre nicht in der Lage zu wissen wo zu binden, das Daten aus IhremHttpServletRequest
Sie würde immer noch eine Instanz vonFooBar
aber die Eigenschaften nicht eingestellt werden, alle Werte aus dem request.InformationsquelleAutor der Antwort zmf
@ModelAttribute
annotierten Parameter erfolgt durch ein eingetragenesServletModelAttributeMethodProcessor
(oderModelAttributeMethodProcessor
) und@RequestParam
annotierten Parameter erfolgt durch ein eingetragenesRequestParamMethodArgumentResolver
oderRequestParamMapMethodArgumentResolver
je nach den Typ des Parameters.Hier eine Erklärung, wie der Frühling verwendet diese
HandlerMethodArgumentResolvers
zu beheben Argumente für den handler Methoden:In beiden Fällen
@ModelAttribute
und@RequestParam
die Werte gebunden zu sein, sind entnommen ausServletRequest
- Parameter.Kann man sich den source-code von den oben genannten Typen, aber hier sind die einfachen details.
Für
@ModelAttribute
Frühling erstellen Sie eine Instanz des Parameters type. Es untersucht die Felder der Instanz und versucht zu binden-parameter-Werte, basierend auf einer Benennungs - /aliasing-Strategie aus der@ModelAttribute
Namen, den Feldnamen. Es verwendet in der Regel eine Gruppe vonConverter
Instanzen konvertieren vonString
(parameter-Werte sind immerString
Werte), was das Feld "Ziel" geben SieInteger
Date
usw. Sie können sich auch registrieren Sie Ihre eigeneConverter
Typen für benutzerdefinierte Konvertierungen. Sie können auch nest POJO-Typen.Für
@RequestParam
Frühling verwenden die gleichenConverter
Instanzen zu konvertieren, die parameter-Werte direkt in den annotierten parameter Typ.Beachten Sie, dass die parameter-Werte sind nicht "weggeworfen". Sie befinden sich in der
HttpServletRequest
für die Dauer des Behälters die request-Verarbeitung Zyklus. Sie können immer auf Sie über die geeignete Methoden.InformationsquelleAutor der Antwort Sotirios Delimanolis
@ModelAttribute
: bindet eine ganze Java-Objekt (wie Mitarbeiter). unterstützt mehrere Anfrage-Parameter@RequestParam
: bindet eine einzelne request-parameter (z.B. Vorname)Im Allgemeinen
@RequestParam
ist am besten für das Lesen eine kleine Anzahl von params.@ModelAttribute
wird verwendet, wenn Sie eine form mit einer großen Anzahl von Feldern.und
@ModelAttribute
gibt Ihnen zusätzliche Funktionen wie Datenbindung, Validierung und form das Vorherige Auffüllen.InformationsquelleAutor der Antwort Harinath
@ModelAttribute
(parameter) lädt ein model-Attribut aus@SessionAttributes
oder aus@ModelAttribute
(Methode).Sie brauchen es nicht nur zum binden von Werten aus einer Anfrage, aber es wird, dass nach dem laden von
@SessionAttributes
.@RequestParam
bindet ein Anfrage-parameter in ein Objekt.InformationsquelleAutor der Antwort Neil McGuigan
Wenn die annotation verwendet wird, auf der methodenebene gibt es die Aufgabe dieser Methode ist das hinzufügen von einem oder mehreren Modell-Parametern. Solche Methoden unterstützen die gleichen Argumenttypen als
@RequestMapping
Methoden aber, die nicht zugeordnet werden können direkt Anfragen.Einer Methode fügt ein Attribut mit dem Namen msg an alle Modelle definiert, die in der controller-Klasse.
Spring-MVC wird immer ein Anruf zuerst zu der Methode, bevor es ruft alle request-handler-Methoden. ,, @ModelAttribute Methoden werden aufgerufen, bevor der controller-Methoden, annotiert mit @RequestMapping aufgerufen werden. Die Logik hinter der Sequenz ist, dass das Modell-Objekt muss erzeugt werden, bevor die Verarbeitung beginnt im controller-Methoden.
Ist es auch wichtig, dass Sie kommentieren der jeweiligen Klasse als @ControllerAdvice. So können Sie Werte im Modell identifiziert werden, die als Globale. Dies bedeutet, dass für jede Anfrage ein Standardwert vorhanden ist, werden für jede Methode in der Reaktion Teil.
Als Methode argument, es gibt das argument, das abgerufen werden soll, aus dem Modell. wenn nicht, sollte es werden zunächst instanziiert, und dann dem Modell Hinzugefügt und sobald vorhanden, die im Modell, die Argumente, Felder, die gefüllt werden sollten, von aller request-Parameter mit passenden Namen.
In der code-snippet folgt, dass das Benutzer-Modell-Attribut gefüllt wird mit Daten aus einem Formular eingereicht, das addUser-Endpunkt. Spring MVC bedeutet dies hinter den kulissen vor dem aufrufen der senden-Methode:
So, es bindet die Formular-Daten mit einer Bohne. Der controller annotiert mit @RequestMapping können benutzerdefinierte Klasse-argument(s) annotiert mit @ModelAttribute.
Dies ist, was ist allgemein bekannt als data binding in Spring-MVC, einen gemeinsamen Mechanismus, dass erspart Ihnen das analysieren jedes Formularfeld einzeln.
InformationsquelleAutor der Antwort Kumar Abhishek