1. Überblick
Eine der wichtigsten Spring-MVC Anmerkungen ist die @ModelAttribute -Anmerkung.
Das @ ModelAttribute ist eine Anmerkung, die einen Methodenparameter oder einen Methodenrückgabewert an ein benanntes Modellattribut bindet und dann einer Webansicht zur Verfügung stellt.
Im folgenden Beispiel werden wir die Benutzerfreundlichkeit und Funktionalität der Annotation anhand eines gemeinsamen Konzepts demonstrieren: Ein Formular, das vom Mitarbeiter eines Unternehmens übermittelt wird.
2. Das @ ModelAttribute in Depth
Wie der einleitende Absatz gezeigt hat, kann @ ModelAttribute entweder als Methodenparameter oder auf Methodenebene verwendet werden.
2.1 Auf Methodenebene
Wenn die Annotation auf Methodenebene verwendet wird, bedeutet dies, dass der Zweck dieser Methode darin besteht, ein oder mehrere Modellattribute hinzuzufügen. Solche Methoden unterstützen dieselben Argumenttypen wie die Methoden von @RequestMapping , dies kann jedoch nicht sein direkt auf Anfragen abgebildet.
Schauen wir uns hier ein schnelles Beispiel an, um zu verstehen, wie das funktioniert:
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("msg", "Welcome to the Netherlands!");
}
Im Beispiel zeigen wir eine Methode, die allen in der Controller-Klasse definierten _model s ein Attribut mit dem Namen msg_ hinzufügt.
Natürlich sehen wir das später in diesem Artikel in Aktion.
Im Allgemeinen ruft Spring-MVC diese Methode immer zuerst auf, bevor Anforderungsbehandlungsmethoden aufgerufen werden. Das heißt, @ ModelAttribute -Methoden werden aufgerufen, bevor die mit @ RequestMapping gekennzeichneten Controller-Methoden aufgerufen werden. Die Logik hinter der Sequenz ist, dass das Modellobjekt erstellt werden muss, bevor eine Verarbeitung innerhalb der Controller-Methoden beginnt.
Es ist auch wichtig, dass Sie die jeweilige Klasse als @ControllerAdvice kommentieren. .
Daher können Sie Werte in Model hinzufügen, die als global gekennzeichnet werden.
Dies bedeutet tatsächlich, dass für jede Anforderung ein Standardwert für jede Methode im Antwortteil vorhanden ist.
2.2 als Methodenargument
Bei Verwendung als Methodenargument bedeutet es, dass das Argument aus dem Modell abgerufen werden soll. Wenn es nicht vorhanden ist, sollte es zuerst instanziiert und dann zum Modell hinzugefügt werden. Sobald die Argumentfelder vorhanden sind, sollten sie aus allen Anforderungsparametern mit übereinstimmenden Namen gefüllt werden.
In dem folgenden Codeausschnitt wird das Modellattribut employee mit Daten aus einem Formular gefüllt, das an den Endpunkt addEmployee übergeben wird.
Spring MVC führt dies im Hintergrund aus, bevor die Submit-Methode aufgerufen wird:
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
//Code that uses the employee object
return "employeeView";
}
Später in diesem Artikel sehen Sie ein vollständiges Beispiel für die Verwendung des Objekts employee zum Auffüllen der Vorlage employeeView .
Es bindet also die Formulardaten mit einer Bean. Der mit @ RequestMapping kommentierte Controller kann über benutzerdefinierte Klassenargumente verfügen, die mit @ModelAttribute . versehen sind.
Dies ist, was in Spring-MVC allgemein als Datenbindung bekannt ist, ein allgemeiner Mechanismus, der es Ihnen erspart, jedes Formularfeld einzeln zu analysieren.
3. Formularbeispiel
In diesem Abschnitt geben wir das Beispiel an, auf das in der Übersicht Bezug genommen wird: ein sehr einfaches Formular, das einen Benutzer (Mitarbeiter eines Unternehmens, in unserem speziellen Beispiel) auffordert, einige persönliche Informationen einzugeben (insbesondere name und __id) Die Übermittlung ist abgeschlossen und ohne Fehler erwartet der Benutzer die zuvor gesendeten Daten auf einem anderen Bildschirm.
3.1 Die Ansicht
Erstellen Sie zunächst ein einfaches Formular mit Feldern für Namen und Namen:
<form:form method="POST" action="/spring-mvc-java/addEmployee"
modelAttribute="employee">
<form:label path="name">Name</form:label>
<form:input path="name"/>
<form:label path="id">Id</form:label>
<form:input path="id"/>
<input type="submit" value="Submit"/>
</form:form>
3.2 Der Controller
Hier ist die Controller-Klasse, in der die Logik für die zuvor erwähnte Sicht implementiert wird:
@Controller
@ControllerAdvice
public class EmployeeController {
private Map<Long, Employee> employeeMap = new HashMap<>();
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(
@ModelAttribute("employee") Employee employee,
BindingResult result, ModelMap model) {
if (result.hasErrors()) {
return "error";
}
model.addAttribute("name", employee.getName());
model.addAttribute("id", employee.getId());
employeeMap.put(employee.getId(), employee);
return "employeeView";
}
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("msg", "Welcome to the Netherlands!");
}
}
In der Methode submit () haben wir ein Employee -Objekt, das an unser View gebunden ist. Können Sie die Kraft dieser Anmerkung sehen? So einfach können Sie Ihre Formularfelder einem Objektmodell zuordnen. In der Methode holen wir Werte aus dem Formular und setzen sie auf ModelMap .
Am Ende geben wir employeeView zurück, was bedeutet, dass die entsprechende JSP-Datei als View -Repräsentant aufgerufen wird. **
Darüber hinaus gibt es auch eine addAttributes () -Methode. Ihr Zweck besteht darin, Werte im Model hinzuzufügen, die global identifiziert werden. Das heißt, ein Standardwert wird als Antwort für jede Anforderung an jede Controller-Methode zurückgegeben. Wir müssen die spezifische Klasse auch als @ ControllerAdvice kommentieren.
3.3 Das Modell
Wie bereits erwähnt, ist das Model -Objekt sehr simpel und enthält alles, was von den Front-End-Attributen benötigt wird. Schauen wir uns ein Beispiel an:
@XmlRootElement
public class Employee {
private long id;
private String name;
public Employee(long id, String name) {
this.id = id;
this.name = name;
}
//standard getters and setters removed
}
3.4 Nachbearbeitung
Das @ ControllerAdvice unterstützt einen Controller und insbesondere @ ModelAttribute -Methoden, die für alle @ RequestMapping -Methoden gelten.
Natürlich wird unsere addAttributes () -Methode vor allen anderen @ RequestMapping -Methoden zuerst ausgeführt.
Wenn man das bedenkt und nachdem sowohl submit () als auch addAttributes () ausgeführt wurden, können wir uns einfach auf sie in der View beziehen, die von der Controller -Klasse zurückgegeben wird, indem wir ihren Vornamen in einem dollarisierten geschweiften Klammerduo wie bei erwähnen Beispiel $ \ {name} .
3.5 Ergebnisansicht
Lassen Sie uns jetzt ausdrucken, was wir vom Formular erhalten haben:
<h3>${msg}</h3>
Name : ${name}
ID : ${id}
4. Fazit
In diesem Lernprogramm wurde die Verwendung der Annotation @ ModelAttribute sowohl für Methodenargumente als auch für Anwendungsfälle auf Methodenebene untersucht. _. _
Die Implementierung dieses einfachen Tutorials ist im Projekt github zu finden. Dies ist ein Maven-basiertes Projekt, daher sollte es einfach sein Importieren und ausführen, wie es ist.