Spring MVC verarbeitet mehrseitige Formulare mit AbstractWizardFormController

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:

  1. _finish: Beenden Sie das Assistentenformular.

  2. _cancel: Brechen Sie das Assistentenformular ab.

  3. _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:

  1. _target1 - gehe zu Seite 2.

  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:

  1. _target0 - gehe zu Seite 1.

  2. _target2 - gehe zu Seite 3.

  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:

  1. _target1 - gehe zu Seite 2.

  2. _finish - Beenden Sie den Assistentenformularprozess und verschieben Sie ihn auf die Zielseite.

  3. _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

  1. processFinish - Wird ausgelöst, wenn der Benutzer auf die Schaltfläche "Senden" mit dem Namen "_finish" klickt.

  2. processCancel - Wird ausgelöst, wenn der Benutzer auf die Schaltfläche "Senden" mit dem Namen "_cancel" klickt.

  3. 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.

SpringMVC-Multipage-Forms-Example1

2. Page1Form.jsp enthält ein Textfeld "Benutzername" und 2 Schaltflächen:

  1. Schaltfläche "Weiter" - gehe zu Page2Form.jsp.

  2. Schaltfläche "Abbrechen" - Wechseln Sie zu WelcomePage.jsp

SpringMVC-Multipage-Forms-Example2

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

SpringMVC-Multipage-Forms-Example2-Error

3. Page2Form.jsp, enthält ein "Passwort" -Feld und 3 Schaltflächen:

  1. Schaltfläche "Zurück" - gehe zu Page1Form.jsp.

  2. Schaltfläche "Weiter" - Wechseln Sie zu "Page3Form.jsp".

  3. Schaltfläche "Abbrechen" - Wechseln Sie zu WelcomePage.jsp.

SpringMVC-Multipage-Forms-Example3

4. Page3Form.jsp, enthält ein Textfeld "Bemerkung" und 3 Schaltflächen:

  1. Schaltfläche "Zurück" - Wechseln Sie zu "Page2Form.jsp".

  2. Schaltfläche „Fertig stellen“ - Verschieben Sie sie zu ResultForm.jsp.

  3. Schaltfläche "Abbrechen" - Wechseln Sie zu WelcomePage.jsp.

SpringMVC-Multipage-Forms-Example4

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

SpringMVC-Multipage-Forms-Example5

Quellcode herunterladen

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