Spring MVC verarbeitet mehrseitige Formulare mit AbstractWizardFormController
In den letztenSpring MVC form handling example sollten SieSimpleFormController verwenden, um das Einreichen von Einzelseitenformularen zu handhaben, was recht einfach und unkompliziert ist.
Manchmal müssen Sie sich jedoch mit „wizard form“ befassen, bei denen das Formular auf mehreren Seiten verarbeitet werden muss, und den Benutzer bitten, das Formular Seite für Seite auszufüllen. In dieser Assistentenformularsituation geht es hauptsächlich darum, wie die Modelldaten (vom Benutzer eingegebene Daten) gespeichert und über mehrere Seiten verteilt werden sollen.
SAbstractWizardFormController
Glücklicherweise wird Spring MVC mit der KlasseAbstractWizardFormControllergeliefert, um dieses Assistentenformular problemlos verarbeiten zu können. In diesem Tutorial zeigen wir Ihnen, wie Sie mit der KlasseAbstractWizardFormControllerdie Daten des Formulars auf mehreren Seiten speichern und übertragen, die Validierung anwenden und die Daten des Formulars auf der letzten Seite anzeigen.
1. Assistentenformularseiten
5 Seiten für diese Demonstration arbeiten in folgenden Sequenzen:
[User] --> WelcomePage --> Page1 --> Page2 --> Page3 --> ResultPage
BeiAbstractWizardFormController wird die Seitenfolge durch den „Namen“ der Senden-Schaltfläche bestimmt:
-
_finish: Beenden Sie das Assistentenformular.
-
_cancel: Brechen Sie das Assistentenformular ab.
-
_targetx: Wechselt zur Zielseite, wobei x der nullbasierte Seitenindex ist. e.g _target0, _target1 and etc.
1. WelcomePage.jsp
Eine Begrüßungsseite mit einem Hyperlink zum Starten des Assistentenformularprozesses.
Handling multipage forms in Spring MVC
Click here to start playing -
AbstractWizardFormController example
2. Page1Form.jsp
Seite 1 zeigt mit einem Textfeld "Benutzername" eine Fehlermeldung an und enthält 2 Senden-Schaltflächen, wobei:
-
_target1 - gehe zu Seite 2.
-
_cancel - bricht den Assistentenformularprozess ab und verschiebt ihn auf die Abbruchseite
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
Page1Form.jsp
Username :
3. Page2Form.jsp
Seite 2 zeigt mit einem "Passwort" -Feld gegebenenfalls eine Fehlermeldung an und enthält 3 Senden-Schaltflächen, wobei:
-
_target0 - gehe zu Seite 1.
-
_target2 - gehe zu Seite 3.
-
_cancel - bricht den Assistentenformularprozess ab und verschiebt ihn auf die Abbruchseite
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
Page2Form.jsp
Password :
4. Page3Form.jsp
Page 3 zeigt mit einem Textfeld „Bemerkung“ gegebenenfalls eine Fehlermeldung an und enthält 3 Senden-Schaltflächen, wobei:
-
_target1 - gehe zu Seite 2.
-
_finish - Beenden Sie den Assistentenformularprozess und verschieben Sie ihn auf die Zielseite.
-
_cancel - bricht den Assistentenformularprozess ab und verschiebt ihn auf die Abbruchseite.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
Page3Form.jsp
Remark :
5. ResultForm.jsp
Zeigt alle Formulardaten an, die auf den vorherigen 3 Seiten gesammelt wurden.
ResultForm.jsp
| UserName : | ${user.userName} |
| Password : | ${user.password} |
| Remark : | ${user.remark} |
2. Modell
Erstellen Sie eine Modellklasse, um die Daten des Formulars zu speichern.
Datei: User.java
package com.example.common.model;
public class User{
String userName;
String password;
String remark;
//getter and setter methods
}
3. AbstractWizardFormController
Erweitert dieAbstractWizardFormController, überschreiben Sie einfach die folgenden Methoden
-
processFinish - Wird ausgelöst, wenn der Benutzer auf die Schaltfläche "Senden" mit dem Namen "_finish" klickt.
-
processCancel - Wird ausgelöst, wenn der Benutzer auf die Schaltfläche "Senden" mit dem Namen "_cancel" klickt.
-
formBackingObject - Verwenden Sie die Modellklasse "Benutzer", um alle Daten des Formulars auf mehreren Seiten zu speichern.
Datei: UserController.java
package com.example.common.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractWizardFormController;
import com.example.common.model.User;
import com.example.common.validator.UserValidator;
public class UserController extends AbstractWizardFormController{
public UserController(){
setCommandName("userForm");
}
@Override
protected Object formBackingObject(HttpServletRequest request)
throws Exception {
return new User();
}
@Override
protected ModelAndView processFinish(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
//Get the data from command object
User user = (User)command;
System.out.println(user);
//where is the finish page?
return new ModelAndView("ResultForm", "user", user);
}
@Override
protected ModelAndView processCancel(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
//where is the cancel page?
return new ModelAndView("WelcomePage");
}
}
Eine einfache Steuerung, um die Ansicht "WelcomePage" zurückzugeben.
Datei: WelcomeController.java
package com.example.common.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class WelcomeController extends AbstractController{
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
return new ModelAndView("WelcomePage");
}
}
4. Validierung von mehrseitigen / Assistentenformularen
InSimpleFormController erstellen Sie eine Validator-Klasse, fügen die gesamte Validierungslogik in dievalidate()-Methode ein und registrieren den Validator dekorativ beim einfachen Formular-Controller.
InAbstractWizardFormController ist dies jedoch etwas anders. Erstellen Sie zunächst eine Validator-Klasse und die Validierungsmethode für jede Seite wie folgt:
Datei: UserValidator.java
package com.example.common.validator;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import com.example.common.model.User;
public class UserValidator implements Validator{
@Override
public boolean supports(Class clazz) {
//just validate the User instances
return User.class.isAssignableFrom(clazz);
}
//validate page 1, userName
public void validatePage1Form(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName",
"required.userName", "Field name is required.");
}
//validate page 2, password
public void validatePage2Form(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password",
"required.password", "Field name is required.");
}
//validate page 3, remark
public void validatePage3Form(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "remark",
"required.remark", "Field name is required.");
}
@Override
public void validate(Object target, Errors errors) {
validatePage1Form(target, errors);
validatePage2Form(target, errors);
validatePage3Form(target, errors);
}
}
File : User.properties - Eigenschaften zum Speichern der Fehlermeldung
required.userName = Username is required! required.password = Password is required! required.remark = Remark is required!
Überschreiben Sie im Assistenten-Formularcontroller (UserController.java) dievalidatePage(), indem Sie den Validator manuell aufrufen (keine Deklaration mehr wie bei einem einfachen Formularcontroller).
Siehe die aktualisierte Version vonUserController.java.
public class UserController extends AbstractWizardFormController{
//other methods, see above
@Override
protected void validatePage(Object command, Errors errors, int page) {
UserValidator validator = (UserValidator) getValidator();
//page is 0-indexed
switch (page) {
case 0: //if page 1 , go validate with validatePage1Form
validator.validatePage1Form(command, errors);
break;
case 1: //if page 2 , go validate with validatePage2Form
validator.validatePage2Form(command, errors);
break;
case 2: //if page 3 , go validate with validatePage3Form
validator.validatePage3Form(command, errors);
break;
}
}
}
Verwenden Sie in der MethodevalidatePage() eine Funktion "switch", um zu bestimmen, welche Seite aufgerufen wird, und ordnen Sie sie dem entsprechenden Validator zu. Die Seite ist 0-indiziert.
5. Federkonfiguration
Deklarieren Sie den Assistenten-Formularcontroller (UserController.java), ordnen Sie alle Seiten in der richtigen Reihenfolge an und registrieren Sie einen Validator.
Page1Form Page2Form Page3Form
Note
In der Eigenschaft "pages" wird in der Reihenfolge des Listenwerts die Reihenfolge der Seite im Assistentenformular definiert.
Vollständiges Beispiel anzeigen:
Page1Form Page2Form Page3Form /WEB-INF/pages/ .jsp
5. Demo
1. WelcomePage.jsp, klicken Sie auf den Link und wechseln Sie zuPage1Form.jsp.

2. Page1Form.jsp enthält ein Textfeld "Benutzername" und 2 Schaltflächen:
-
Schaltfläche "Weiter" - gehe zu Page2Form.jsp.
-
Schaltfläche "Abbrechen" - Wechseln Sie zu WelcomePage.jsp

Wenn der Benutzername beim Absenden des Formulars leer ist, wird die Fehlermeldung angezeigt.

3. Page2Form.jsp, enthält ein "Passwort" -Feld und 3 Schaltflächen:
-
Schaltfläche "Zurück" - gehe zu Page1Form.jsp.
-
Schaltfläche "Weiter" - Wechseln Sie zu "Page3Form.jsp".
-
Schaltfläche "Abbrechen" - Wechseln Sie zu WelcomePage.jsp.

4. Page3Form.jsp, enthält ein Textfeld "Bemerkung" und 3 Schaltflächen:
-
Schaltfläche "Zurück" - Wechseln Sie zu "Page2Form.jsp".
-
Schaltfläche „Fertig stellen“ - Verschieben Sie sie zu ResultForm.jsp.
-
Schaltfläche "Abbrechen" - Wechseln Sie zu WelcomePage.jsp.

5. ResultForm.jsp, zeigt alle Daten des Formulars an.

Quellcode herunterladen
Laden Sie es herunter -SpringMVC-MultiPage-Form-Handling-Example.zip (12 KB)