Erste Schritte mit Formularen in Spring MVC

1. Übersicht

In diesem Artikel werden Spring-Formulare und die Datenbindung an einen Controller erläutert. Außerdem werden wir uns eine der Hauptanmerkungen in Spring MVC ansehen, nämlich @ModelAttribute .

Natürlich ist Spring MVC ein komplexes Thema mit vielen Dingen, die Sie verstehen müssen, um sein volles Potenzial auszuschöpfen. Gehen Sie also auf jeden Fall tiefer in das Framework ein.

2. Das Modell

Zunächst definieren wir eine einfache Entität , die angezeigt und an das Formular gebunden wird:

public class Employee { private String name; private long id; private String contactNumber; // standard getters and setters }

Dies wird unser Formular-Backing-Objekt sein.

3. Die Ansicht

Als nächstes definieren wir das eigentliche Formular und natürlich die HTML-Datei, die es enthält. Wir werden eine Seite verwenden, auf der ein neuer Mitarbeiter erstellt / registriert wird:

Welcome, Enter The Employee Details

Name
Id
Contact Number

Beachten Sie zunächst , dass wir eine Tag-Bibliothek in unsere JSP-Seite aufnehmen - die Formular- Taglib -, um die Definition unseres Formulars zu erleichtern.

Weiter - die Tag spielt hier eine wichtige Rolle; Es ist dem regulären HTLM sehr ähnlichTag, aber das Attribut modelAttribute ist der Schlüssel, der einen Namen des Modellobjekts angibt, das dieses Formular unterstützt:

Dies entspricht dem @ModelAttribute später im Controller.

Weiter - jedes Eingabefeld verwendet ein weiteres nützliches Tag aus dem Spring Form-Taglib- Formular: Präfix . Jedes dieser Felder legt einen Pfad Attribut - das muss entsprechen einem Getter / setter des Modells Attribut (in diesem Fall ist die Klasse Employee). Wenn die Seite geladen wird, werden die Eingabefelder von Spring ausgefüllt, das den Getter jedes an ein Eingabefeld gebundenen Felds aufruft. Wenn das Formular gesendet wird, werden die Setter aufgerufen, um die Werte des Formulars im Objekt zu speichern.

Schließlich wird beim Senden des Formulars der POST-Handler im Controller aufgerufen und das Formular automatisch an das von uns übergebene Mitarbeiterargument gebunden .

4. Der Controller

Schauen wir uns nun den Controller an , der das Back-End übernimmt:

@Controller public class EmployeeController { @RequestMapping(value = "/employee", method = RequestMethod.GET) public ModelAndView showForm() { return new ModelAndView("employeeHome", "employee", new Employee()); } @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("contactNumber", employee.getContactNumber()); model.addAttribute("id", employee.getId()); return "employeeView"; } }

Der Controller definiert zwei einfache Vorgänge - den GET zum Anzeigen von Daten im Formular und den POST für den Erstellungsvorgang über das Senden des Formulars.

Beachten Sie auch, dass Spring sich beschweren würde, wenn das Objekt "Mitarbeiter" nicht zum Modell hinzugefügt wird, wenn wir versuchen, auf die JSP zuzugreifen, da die JSP so eingerichtet wird, dass das Formular an das Modellattribut "Mitarbeiter" gebunden wird:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'employee' available as request attribute at o.s.w.s.s.BindStatus.(BindStatus.java:141) 

Um auf unser Formular-Backing-Objekt zugreifen zu können, müssen wir es über die Annotation @ModelAttribute einfügen .

Ein @ModelAttribute Argument für eine Methode gibt an, dass das Argument aus dem Modell abgerufen wird. Wenn das Modell nicht vorhanden ist, wird das Argument zuerst instanziiert und dann dem Modell hinzugefügt.

5. Umgang mit Bindungsfehlern

Standardmäßig löst Spring MVC eine Ausnahme aus, wenn während der Anforderungsbindung Fehler auftreten. Dies ist normalerweise nicht das, was wir wollen. Stattdessen sollten wir diese Fehler dem Benutzer präsentieren. Wir werden ein BindingResult verwenden, indem wir unserer Controller-Methode eines als Argument hinzufügen:

public String submit( @Valid @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model)

Das BindingResult- Argument muss direkt hinter unserem Formular-Backing-Objekt positioniert werden. Dies ist einer der seltenen Fälle, in denen die Reihenfolge der Methodenargumente von Bedeutung ist. Andernfalls wird die folgende Ausnahme auftreten:

java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

Jetzt wird keine Ausnahme mehr ausgelöst. Stattdessen werden Fehler auf der registrierten BindingResult , die dem übergeben einreichen Verfahren. An diesem Punkt können wir diese Fehler auf verschiedene Arten behandeln - zum Beispiel kann der Vorgang abgebrochen werden:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } //Do Something return "employeeView"; }

Beachten Sie, dass wir für den Fall, dass das Ergebnis Fehler enthält, eine andere Ansicht an den Benutzer zurückgeben, um diese Fehler korrekt anzuzeigen. Werfen wir einen Blick auf diese Ansicht - error.jsp :

Please enter the correct details

Retry

6. Anzeigen eines Mitarbeiters

Neben der Erstellung eines neuen Mitarbeiters können wir auch einfach einen anzeigen - hier ist der Schnellansichtscode dafür:

Submitted Employee Information

Name : ${name}
ID : ${id}
Contact Number : ${contactNumber}

Die JSP-Seite verwendet einfach EL-Ausdrücke, um Werte der Eigenschaften des Employee-Objekts im Modell anzuzeigen.

7. Testen der Anwendung

Die einfache Anwendung kann bereitgestellt werden - beispielsweise auf einem Tomcat-Server - und lokal aufgerufen werden:

// localhost: 8080 / spring-mvc-xml / employee

Dies ist die Ansicht, die das Hauptformular enthält - vor dem Übermittlungsvorgang:

Beispiel für ein Spring MVC-Formular - Senden

Nach dem Senden werden die Daten angezeigt:

Beispiel für ein Spring MVC-Formular - Ansicht

Und das war's - ein funktionierendes Beispiel für ein einfaches Formular mit Spring MVC mit Validierung .

Die Implementierung dieses Spring MVC-Tutorials finden Sie im GitHub-Projekt - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.

Schließlich sollten Sie, wie ich gleich zu Beginn des Artikels sagte, auf jeden Fall tiefer in Spring MVC eintauchen.