Spring MVC und die @ ModelAttribute-Annotation

1. Übersicht

Eine der wichtigsten Spring-MVC-Annotationen ist die @ ModelAttribute-Annotation.

Das @ModelAttribute ist eine Annotation, die einen Methodenparameter oder einen Methodenrückgabewert an ein benanntes Modellattribut bindet und es dann einer Webansicht zur Verfügung stellt.

Im folgenden Beispiel werden wir die Benutzerfreundlichkeit und Funktionalität der Anmerkung anhand eines gemeinsamen Konzepts demonstrieren: eines Formulars, das von einem Mitarbeiter eines Unternehmens eingereicht wurde.

2. Das @ModelAttribute im Detail

Wie aus dem einleitenden Absatz hervorgeht, kann @ModelAttribute entweder als Methodenparameter oder auf Methodenebene verwendet werden.

2.1 Auf Methodenebene

Wenn die Annotation auf Methodenebene verwendet wird, gibt sie an, dass der Zweck dieser Methode darin besteht, ein oder mehrere Modellattribute hinzuzufügen. Solche Methoden unterstützen dieselben Argumenttypen wie @ RequestMapping-Methoden, können jedoch nicht direkt Anforderungen zugeordnet werden.

Schauen wir uns hier ein kurzes Beispiel an, um zu verstehen, wie dies 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 Modellen ein Attribut mit dem Namen msg hinzufügt .

Natürlich werden wir dies später in diesem Artikel in Aktion sehen.

Im Allgemeinen ruft Spring-MVC diese Methode immer zuerst auf, bevor sie Anforderungshandlermethoden aufruft. Das heißt, @ ModelAttribute- Methoden werden aufgerufen, bevor die mit @RequestMapping annotierten Controller-Methoden aufgerufen werden. Die Logik hinter der Sequenz besteht darin, 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 mit Anmerkungen versehen. Auf diese Weise können Sie im Modell Werte hinzufügen , die als global identifiziert 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 gibt es an, dass das Argument aus dem Modell abgerufen werden soll. Wenn es nicht vorhanden ist, sollte es zuerst instanziiert und dann dem Modell hinzugefügt werden. Sobald es im Modell vorhanden ist, sollten die Argumentfelder aus allen Anforderungsparametern mit übereinstimmenden Namen ausgefüllt werden.

In dem folgenden Codeausschnitt wird das Mitarbeitermodellattribut mit Daten aus einem Formular gefüllt , das an den Endpunkt addEmployee gesendet wurde . Spring MVC führt dies hinter den Kulissen durch, 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 wir ein vollständiges Beispiel für die Verwendung des Mitarbeiterobjekts zum Auffüllen der employeeView- Vorlage.

Es bindet also die Formulardaten mit einer Bean. Der mit @RequestMapping annotierte Controller kann benutzerdefinierte Klassenargumente haben, die mit @ModelAttribute annotiert sind .

Dies wird in Spring-MVC allgemein als Datenbindung bezeichnet. Dies ist ein allgemeiner Mechanismus, mit dem Sie nicht jedes Formularfeld einzeln analysieren müssen.

3. Formularbeispiel

In diesem Abschnitt stellen wir das Beispiel vor, auf das im Übersichtsabschnitt verwiesen wird: Ein sehr einfaches Formular, das einen Benutzer (Mitarbeiter eines Unternehmens in unserem speziellen Beispiel) auffordert, einige persönliche Informationen (insbesondere Name und ID) einzugeben . Nach Abschluss der Übermittlung und ohne Fehler erwartet der Benutzer, dass die zuvor übermittelten Daten auf einem anderen Bildschirm angezeigt werden.

3.1 Die Ansicht

Erstellen wir zunächst ein einfaches Formular mit ID- und Namensfeldern:

 Name  Id    

3.2 Der Controller

Hier ist die Controller-Klasse, in der die Logik für die oben genannte Ansicht implementiert wird:

@Controller @ControllerAdvice public class EmployeeController { private Map 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!"); } }

Bei der Methode submit () ist ein Employee- Objekt an unsere Ansicht gebunden . Können Sie die Kraft dieser Anmerkung erkennen? So einfach können Sie Ihre Formularfelder einem Objektmodell zuordnen. In der Methode rufen wir Werte aus dem Formular ab und setzen sie auf ModelMap .

Am Ende geben wir employeeView zurück , was bedeutet, dass die jeweilige JSP-Datei als View- Vertreter aufgerufen wird .

Darüber hinaus gibt es auch eine addAttributes () -Methode. Ziel ist es, dem Modell Werte 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 auch die spezifische Klasse als @ControllerAdvice kommentieren .

3.3 Das Modell

Wie bereits erwähnt, ist das Model- Objekt sehr simpel und enthält alles, was für die Front-End-Attribute erforderlich ist. Schauen wir uns nun 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 Zusammenfassung

Das @ ControllerAdvice unterstützt einen Controller und insbesondere @ ModelAttribute- Methoden, die für alle @ RequestMapping- Methoden gelten . Natürlich wird unsere addAttributes () -Methode die erste sein, die vor den übrigen @ RequestMapping- Methoden ausgeführt wird.

Wenn Sie dies berücksichtigen und nachdem sowohl submit () als auch addAttributes () ausgeführt wurden, können Sie in der von der Controller- Klasse zurückgegebenen Ansicht auf sie verweisen , indem Sie ihren Vornamen in einem Dollar-Duo mit geschweiften Klammern angeben, z. B. $ {Name} .

3.5 Ergebnisansicht

Drucken wir nun aus, was wir aus dem Formular erhalten haben:

${msg}

Name : ${name} ID : ${id}

4. Fazit

In diesem Tutorial haben wir die Verwendung der Annotation @ModelAttribute sowohl für Methodenargumente als auch für Anwendungsfälle auf Methodenebene untersucht .

Die Implementierung dieses einfachen Tutorials finden Sie im Github-Projekt.