AbstractWizardFormControllerで複数のフォームを処理するSpring MVC

AbstractWizardFormControllerで複数のフォームを処理するSpring MVC

最後のSpring MVC form handling exampleでは、SimpleFormControllerを使用して単一ページのフォーム送信を処理する必要があります。これは非常に簡単で簡単です。

ただし、フォームを複数のページに処理する必要がある「wizard form」を処理し、ユーザーにページごとにフォームに入力するように依頼する必要がある場合があります。 このウィザードフォームの状況での主な関心事は、モデルデータ(ユーザーが入力したデータ)を保存し、複数のページにまたがる方法です。

SAbstractWizardFormController

幸い、Spring MVCには、このウィザードフォームを簡単に処理するためのAbstractWizardFormControllerクラスが付属しています。 このチュートリアルでは、AbstractWizardFormControllerクラスを使用して、フォームのデータを複数のページに保存して表示し、検証を適用して、最後のページにフォームのデータを表示する方法を示します。

1. ウィザードフォームページ

このデモンストレーションの5ページは、次の順序で機能します。

[User] --> WelcomePage --> Page1 --> Page2 --> Page3 --> ResultPage

AbstractWizardFormControllerの場合、ページシーケンスは送信ボタンの「名前」によって決定されます。

  1. _finish:ウィザードフォームを完了します。

  2. _cancel:ウィザードフォームをキャンセルします。

  3. _targetx:ターゲットページに移動します。xはゼロベースのページインデックスです。 e.g _target0, _target1 and etc.

1. WelcomePage.jsp
ウェルカムページ。ウィザードフォームプロセスを開始するためのハイパーリンクがあります。



    

Handling multipage forms in Spring MVC

Click here to start playing - AbstractWizardFormController example

2. Page1Form.jsp
ページ1には、「ユーザー名」テキストボックスがあり、エラーメッセージがあれば表示され、2つの送信ボタンが含まれています。ここで:

  1. _target1 –ページ2に移動します。

  2. _cancel –ウィザードフォームプロセスをキャンセルし、キャンセルページに移動します

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>






    

Page1Form.jsp

Username :

3. Page2Form.jsp
ページ2には、「パスワード」フィールドがあり、エラーメッセージがあれば表示され、3つの送信ボタンが含まれています。ここで:

  1. _target0 –ページ1に移動します。

  2. _target2 –ページ3に移動します。

  3. _cancel –ウィザードフォームプロセスをキャンセルし、キャンセルページに移動します

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>






    

Page2Form.jsp

Password :

4. Page3Form.jsp
ページ3には、「コメント」テキストボックスがあり、エラーメッセージがあれば表示され、3つの送信ボタンが含まれています。ここで:

  1. _target1 –ページ2に移動します。

  2. _finish –ウィザードフォームプロセスを終了し、それを終了ページに移動します。

  3. _cancel –ウィザードフォームプロセスをキャンセルし、キャンセルページに移動します。

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>






    

Page3Form.jsp

Remark :

5. ResultForm.jsp
前の3ページから収集したすべてのフォームのデータを表示します。



    

ResultForm.jsp

UserName : ${user.userName}
Password : ${user.password}
Remark : ${user.remark}

2. モデル

フォームのデータを保存するモデルクラスを作成します。

ファイル:User.java

package com.example.common.model;

public class User{

    String userName;
    String password;
    String remark;

    //getter and setter methods
}

3. AbstractWizardFormController

AbstractWizardFormControllerを拡張し、次のメソッドをオーバーライドするだけです

  1. processFinish-ユーザーが「_finish」という名前の送信ボタンをクリックすると起動します。

  2. processCancel –ユーザーが「_cancel」という名前の送信ボタンをクリックすると起動します。

  3. formBackingObject –「ユーザー」モデルクラスを使用して、すべてのフォームのデータを複数のページに保存します。

ファイル: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");
    }
}

WelcomePage」ビューを返す単純なコントローラー。

ファイル: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. マルチページ/ウィザードフォーム検証

SimpleFormControllerでは、バリデータークラスを作成し、すべての検証ロジックをvalidate()メソッド内に配置し、バリデーターを単純なフォームコントローラーに装飾的に登録します。

ただし、AbstractWizardFormControllerでは少し異なります。 最初に、次のように、各ページの検証クラスと検証メソッドを作成します。

ファイル: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 –エラーメッセージを保存するプロパティ

required.userName = Username is required!
required.password = Password is required!
required.remark = Remark is required!

また、ウィザードフォームコントローラー(UserController.java)で、バリデーターを手動で呼び出してvalidatePage()をオーバーライドします(単純なフォームコントローラーのような宣言はもうありません)。

UserController.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;
        }
    }
}

validatePage()メソッドで、「switch」関数を使用して、呼び出しているページを判別し、対応するバリデーターに関連付けます。 ページのインデックスは0です。

5. スプリング構成

ウィザードフォームコントローラー(UserController.java)を宣言し、すべてのページを正しい順序に配置して、バリデーターを登録します。

    
           
        
        
        Page1Form 
        Page2Form 
        Page3Form 
        
       
       
        
       
       

Note
「pages」プロパティでは、リスト値の順序を使用して、ウィザードフォームでページの順序を定義します。

完全な例を参照してください。



 

    
    
        
       
        
        Page1Form 
        Page2Form 
        Page3Form 
       
       
       
        
       
      

      
      
       
      

      
           
                /WEB-INF/pages/
           
           
                .jsp
           
       

5. Demo

1. WelcomePage.jsp、リンクをクリックし、Page1Form.jspに移動します。

SpringMVC-Multipage-Forms-Example1

2. Page1Form.jspには、「ユーザー名」テキストボックスフィールドと2つのボタンが含まれています。

  1. 「次へ」ボタン-Page2Form.jspに移動します。

  2. 「キャンセル」ボタン-WelcomePage.jspに移動

SpringMVC-Multipage-Forms-Example2

フォームの送信中に「ユーザー名」が空の場合は、エラーメッセージを表示します。

SpringMVC-Multipage-Forms-Example2-Error

3. Page2Form.jspには、「パスワード」フィールドと3つのボタンが含まれています。

  1. 「前へ」ボタン-Page1Form.jspに移動します。

  2. 「次へ」ボタン-Page3Form.jspに移動します。

  3. 「キャンセル」ボタン-WelcomePage.jspに移動します。

SpringMVC-Multipage-Forms-Example3

4. Page3Form.jspには、「備考」テキストボックスフィールドと3つのボタンが含まれています。

  1. 「前へ」ボタン-Page2Form.jspに移動します。

  2. 「終了」ボタン-ResultForm.jspに移動します。

  3. 「キャンセル」ボタン-WelcomePage.jspに移動します。

SpringMVC-Multipage-Forms-Example4

5. ResultForm.jsp、すべてのフォームのデータを表示します。

SpringMVC-Multipage-Forms-Example5

ソースコードをダウンロード

ダウンロード–SpringMVC-MultiPage-Form-Handling-Example.zip(12KB)