it-swarm.com.de

Was ist @ModelAttribute in Spring MVC?

Was ist der Zweck und Gebrauch von @ModelAttribute in Spring MVC?

329
Mohammad Adnan

@ModelAttribute bezieht sich auf eine Eigenschaft des Model-Objekts (das M in MVC;) Angenommen, wir haben ein Formular mit einem Formular-Sicherungsobjekt, das als "Person" .__ bezeichnet wird. Dann können Sie Spring MVC verwenden Übergeben Sie dieses Objekt an eine Controller-Methode, indem Sie die Annotation @ModelAttribute verwenden:

public String processForm(@ModelAttribute("person") Person person){
    person.getStuff();
}

Hier prüfen Für ein Beispiel (Spring 2.5), siehe auch "@ModelAttribute für ein Methodenargument verwenden" (Spring 3.1).

Andererseits wird die Annotation verwendet, um Objekte zu definieren, die Teil eines Modells sein sollten ..__ Wenn Sie also ein Person-Objekt im Modell referenzieren möchten, können Sie die folgende Methode verwenden:

@ModelAttribute("person")
public Person getPerson(){
    return new Person();
}

Diese kommentierte Methode ermöglicht den Zugriff auf das Personenobjekt in Ihrer Ansicht, da sie automatisch von Spring zu den Models hinzugefügt wird. 

Siehe "@ModelAttribute für eine Methode verwenden" (Spring 3.1).

Hoffe das hat geholfen.

372
fasseg

Ich weiß, dass dies ein alter Faden ist, aber ich dachte, ich würde meinen Hut in den Ring werfen und sehen, ob ich das Wasser etwas schlammiger machen kann :)

Ich fand meine anfängliche Mühe, @ModelAttribute zu verstehen, war das Ergebnis der Entscheidung von Spring, mehrere Anmerkungen zu einer zu kombinieren. Es wurde klarer, als ich es in mehrere kleinere Anmerkungen aufteilte:

Stellen Sie sich bei Parameteranmerkungen @ModelAttribute als Entsprechung von @Autowired + @Qualifier vor, d. H. Es versucht, eine Bean mit dem angegebenen Namen aus dem von Spring verwalteten Modell abzurufen. Wenn die benannte Bean nicht gefunden wird, anstatt einen Fehler auszugeben oder null zurückzugeben, übernimmt sie implizit die Rolle von @Bean, d. H. Erstellen Sie eine neue Instanz mit dem Standardkonstruktor und fügen Sie die Bean dem Modell hinzu.

Bei Methodenanmerkungen stellen Sie sich @ModelAttribute als Entsprechung von @Bean + @Before vor, d. H. Es setzt die durch den Code des Benutzers erstellte Bean in das Modell und wird immer vor einer Anforderungsbehandlungsmethode aufgerufen.

Bildlich sehe ich @ModelAttribute wie folgt (bitte nicht wörtlich nehmen !!):

@Bean("person")
@Before
public Person createPerson(){
  return new Person();
}

@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
  ...
}

Wie Sie sehen können, hat Spring die richtige Entscheidung getroffen, um @ModelAttribute eine allumfassende Anmerkung zu machen. niemand will ein Anmerkungs-Smorgasbord sehen.

123

Für meinen Stil verwende ich immer @ModelAttribute, um ein Objekt aus dem Spring-Formular jsp zu fangen. Zum Beispiel entwerfe ich ein Formular auf der JSP-Seite. Dieses Formular existiert mit commandName

<form:form commandName="Book" action="" methon="post">
      <form:input type="text" path="title"></form:input>
</form:form>

und ich fange das Objekt auf dem Controller mit folgendem Code

public String controllerPost(@ModelAttribute("Book") Book book)

und jeder Feldname des Buches muss mit dem Pfad im Unterelement des Formulars übereinstimmen 

21
Leang Socheat

Also werde ich versuchen, es einfacher zu erklären. Lass uns:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

Wie in der Spring MVC-Dokumentation beschrieben, kann die Annotation @ModelAttribute für Methods oder für method-Argumente verwendet werden. Und natürlich können wir beide gleichzeitig in einem Controller verwenden.

1.Method Annotation

@ModelAttribute(“cities”)
 public List<String> checkOptions(){
 return new Arrays.asList(new[]{“Sofia”,”Pleven","Ruse”});//and so on
}

Zweck dieser Methode ist das Hinzufügen von Attributen im Modell. In unserem Fall haben cities - Taste die Liste new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”}) als Wert im Model (Sie können Model als Map (key: value)). @ModelAttribute -Methoden in einem Controller werden vor @RequestMapping -Methoden innerhalb desselben Controllers aufgerufen. 

Hier möchten wir dem Modell allgemeine Informationen hinzufügen, die in dem Formular zur Anzeige für den Benutzer verwendet werden. Es kann zum Beispiel verwendet werden, um eine HTML-Auswahl auszufüllen:

 enter image description here

2.Methode Argument

public String findPerson(@ModelAttriute(value="person") Person person) {
    //..Some logic with person
    return "person.jsp";
}

Ein @ModelAttribute für ein Methodenargument gibt an, dass das Argument aus dem Modell abgerufen werden soll. In diesem Fall erwarten wir also, dass wir im Objekt person ein Objekt als Schlüssel haben, und wir möchten seinen Wert abrufen und das Methodenargument person person angeben. Wenn eine solche nicht existiert oder (manchmal falsch geschrieben ist (value = "persson")), wird sie von Spring nicht im Modell gefunden und erstellt ein leeres Person-Objekt mit seinen Standardwerten. Dann nehmen Sie die Anforderungsparameter und versuchen, sie im Personenobjekt unter Verwendung ihrer Namen zu binden.

name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&

Wir haben also einen Namen und er wird mit setName (String name) an Person.name gebunden. Also in 

//..Some logic with person

wir haben Zugriff auf diesen vollen Namen mit dem Wert "Dimitrij".

Natürlich kann Spring auch komplexere Objekte wie Listen, Karten, Liste von Kartensätzen usw. binden, aber hinter der Szene macht es die Datenbindung zu einem Zauber.

  1. Wir können gleichzeitig eine mit einem Modell versehene Methode und einen Methodenhandler mit @ModelAttribute in den Argumenten haben. Dann müssen wir die Regeln vereinigen. 

  2. Natürlich gibt es viele verschiedene Situationen - @ModelAttribute-Methoden können auch in einem @ControllerAdvice usw. definiert werden.

15
Xelian

Ich weiß, dass ich zu spät zur Party komme, aber ich zitiere, wie sie sagen: "Besser spät als nie". Also lasst uns gehen,. Jeder hat seine eigenen Wege, um Dinge zu erklären. Lassen Sie mich versuchen, es zusammenzufassen und es in einem einfachen Schritt mit einem Beispiel zu erklären: Angenommen, Sie haben eine einfache Form, Form .jsp

<form:form action="processForm" modelAttribute="student">
First Name : <form:input path="firstName" /> 
<br><br>
Last Name : <form:input path="lastName" />
<br><br>
<input type="submit" value="submit"/>
</form:form>

path = "firstName" path = "lastName" Dies sind die Felder/Eigenschaften in der StudentClass Wenn das Formular aufgerufen wird, werden ihre Getter aufgerufen, aber sobald sie übergeben wurden, werden ihre Setter aufgerufen und ihre Werte werden gesetzt Die Bean, die im modelAttribute = "student" im form-Tag angegeben wurde.

Wir haben StudentController, der die folgenden Methoden enthält:

@RequestMapping("/showForm")
public String showForm(Model theModel){ //Model is used to pass data between 
//controllers and views
    theModel.addAttribute("student", new Student()); //attribute name, value
return "form";
}

@RequestMapping("/processForm")
public String processForm(@ModelAttribute("student") Student theStudent){
    System.out.println("theStudent :"+ theStudent.getLastName());
return "form-details";
}

//@ModelAttribute("student") Student theStudent
//Spring automatically populates the object data with form data all behind the 
//scenes 

jetzt haben wir endlich eine form-details.jsp

<b>Student Information</b>
${student.firstName}
${student.lastName}

Zurück zu der Frage Was ist @ModelAttribute in Spring MVC? Eine Beispieldefinition aus der Quelle für Sie: http://www.baeldung.com/spring-mvc-und-the-modelattribute- Annotation Das @ModelAttribute ist eine Annotation, die einen Methodenparameter oder einen Methodenrückgabewert an ein benanntes Modellattribut bindet und ihn einer Webansicht verfügbar macht.

Was tatsächlich passiert, ist, dass es alle Werte der ur-Form erhält, die von ihm übergeben wurden, und diese dann für Sie bindet oder dem Objekt zugewiesen. Es funktioniert genauso wie @RequestParameter, wobei wir nur einen Parameter erhalten und den Wert einem Feld zuweisen. Der einzige Unterschied ist @ModelAttribute enthält alle Formulardaten und nicht einen einzelnen Parameter. Es erstellt eine Bean für Sie, die übermittelte Daten enthält, die später vom Entwickler verwendet werden sollen.

Um das Ganze noch einmal zusammenzufassen . Schritt 1: Eine Anfrage wird gesendet und unsere Methode showForm wird ausgeführt und ein Modell, ein temporäres Bean, mit dem Namen student wird an das Formular weitergeleitet .theModel.addAttribute ("student", neuer Student ());

Schritt 2: modelAttribute = "student" Beim Formularvorlagenmodell ändert sich der Student, und jetzt werden alle Parameter des Formulars gespeichert

Schritt 3: @ModelAttribute ("student") Student theStudent Wir holen die von @ModelAttribute gehaltenen Werte ab und weisen das zu ganze Bohne/Objekt an Student.

Schritt 4: .__ Und dann verwenden wir es als Gebot, genauso wie ich es auf der Seite usw. zeige

Ich hoffe, es hilft Ihnen, das Konzept zu verstehen. Vielen Dank

8
Majid Ali Khan

Dies wird zur Datenbindung in Spring MVC verwendet. Angenommen, Sie haben ein jsp mit einem Formularelement, z

auf JSP

<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>

(Springform-Methode, einfaches Formularelement kann ebenfalls verwendet werden)

Auf der Controller-Seite

@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {

}

Wenn Sie nun das Formular absenden, stehen Ihnen die Werte der Formularfelder zur Verfügung.

4
Awais

Anmerkung, die einen Methodenparameter oder einen Methodenrückgabewert an ein benanntes Modellattribut bindet und für eine Webansicht verfügbar ist. 

public String add(@ModelAttribute("specified") Model model) {
    ...
}
4
Byeon0gam

@ModelAttribute kann als Methodenargumente/Parameter oder vor der Methodendeklaration ..__ verwendet werden. Das Hauptziel dieser Anmerkung besteht darin, die Anforderungsparameter oder Formularfelder an ein Modellobjekt zu binden

Ref. http://www.javabeat.net/modelattribute-spring-mvc/

2
Chethan D

@ModelAttribute bindet den Wert von JSP-Feldern einfach an Pojo-Cals, um unsere Logik in der Controller-Klasse auszuführen. Wenn Sie mit Streben vertraut sind, wird das Formbean-Objekt bei der Übergabe mit Daten gefüllt.

1
Ragu Venkatesan

Die ModelAttribute-Annotation wird als Teil einer Spring MVC-Webanwendung verwendet und kann in zwei Szenarien verwendet werden.

Zunächst können Daten in ein Pre-JSP-Lademodell eingefügt werden. Dies ist besonders nützlich, um sicherzustellen, dass eine JSP erforderlich ist, um alle Daten selbst anzuzeigen. Eine Injektion wird erhalten, indem eine Methode an das Modell angeschlossen wird.

Zweitens können Daten aus einem vorhandenen Modell gelesen und den Parametern der Coach-Methode zugewiesen werden.

refrence https://dzone.com/articles/using-spring-mvc%E2%80%99s

0
ismael

Nehmen Sie eine beliebige Webanwendung, egal ob es sich um Google Mail oder Facebook oder Instagram oder eine andere Webanwendung handelt. Es geht um den Austausch von Daten oder Informationen zwischen dem Endbenutzer und der Anwendung oder der Benutzeroberfläche und der Back-End-Anwendung. Auch in der Spring MVC-Welt gibt es zwei Möglichkeiten, Daten auszutauschen:

  1. vom Controller zur Benutzeroberfläche und 
  2. von der Benutzeroberfläche zum Controller.

Was uns interessiert, ist, wie die Daten von der Benutzeroberfläche an den Controller übermittelt werden. Dies kann auch auf zwei Arten erfolgen:

  1. Verwendung eines HTML-Formulars
  2. Abfrageparameter verwenden.

Verwendung eines HTML-Formulars: Betrachten Sie das folgende Szenario: 

 Form Submission Representation

Wenn wir die Formulardaten über den Webbrowser senden, können wir auf diese Daten in unserer Controller-Klasse als Objekt zugreifen. Wenn wir ein HTML-Formular absenden, erledigt der Spring Container vier Dinge. Es wird,

  1. lesen Sie zuerst alle übermittelten Daten aus der Anforderung mit der Methode request.getParameter.
  2. sobald sie gelesen werden, werden sie mit integer.parseInt, double.parseDouble und allen anderen verfügbaren Analysemethoden in den entsprechenden Java-Typ konvertiert, abhängig vom Datentyp der Daten. 
  3. nach der Analyse wird ein Objekt der von uns erstellten Modellklasse erstellt. In diesem Szenario werden zum Beispiel die Benutzerinformationen übermittelt, und wir erstellen eine Klasse mit dem Namen Benutzer, aus der der Container ein Objekt erstellt, und es werden alle Werte festgelegt, die automatisch in dieses Objekt eingehen. 
  4. dieses Objekt wird dann übergeben, indem die Werte an den Controller gesetzt werden.

Damit das Ganze funktioniert, müssen wir bestimmte Schritte befolgen.

 Internal working

Wir müssen zunächst eine Modellklasse wie User definieren, in der die Anzahl der Felder genau mit der Anzahl der Felder im HTML-Formular übereinstimmen sollte. Die Namen, die wir im HTML-Formular verwenden, sollten auch den Namen der Java-Klasse entsprechen. Diese beiden sind sehr wichtig. Namen sollten übereinstimmen, die Anzahl der Felder im Formular sollte der Anzahl der Felder in der von uns erstellten Klasse entsprechen. Sobald dies geschehen ist, liest der Container automatisch die eingehenden Daten, erstellt ein Objekt dieses Modells, legt die Werte fest und übergibt es dem Controller. Um diese Werte innerhalb des Controllers zu lesen, verwenden wir die Annotation @ModelAttribute für die Methodenparameter. Wenn wir im Controller Methoden erstellen, verwenden wir das @ModelAttribute und fügen einen Parameter hinzu, der dieses Objekt automatisch durch den Container übergeben wird.

Hier ist ein Beispielcode für die Registrierung eines Benutzers:

@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
    model.addAttribute("user", user);
    return "regResult";
}

Hoffe, diese diagrammatische Erklärung hat geholfen!

0
Nithin Prasad