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の場合、ページシーケンスは送信ボタンの「名前」によって決定されます。
-
_finish:ウィザードフォームを完了します。
-
_cancel:ウィザードフォームをキャンセルします。
-
_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つの送信ボタンが含まれています。ここで:
-
_target1 –ページ2に移動します。
-
_cancel –ウィザードフォームプロセスをキャンセルし、キャンセルページに移動します
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
Page1Form.jsp
Username :
3. Page2Form.jsp
ページ2には、「パスワード」フィールドがあり、エラーメッセージがあれば表示され、3つの送信ボタンが含まれています。ここで:
-
_target0 –ページ1に移動します。
-
_target2 –ページ3に移動します。
-
_cancel –ウィザードフォームプロセスをキャンセルし、キャンセルページに移動します
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
Page2Form.jsp
Password :
4. Page3Form.jsp
ページ3には、「コメント」テキストボックスがあり、エラーメッセージがあれば表示され、3つの送信ボタンが含まれています。ここで:
-
_target1 –ページ2に移動します。
-
_finish –ウィザードフォームプロセスを終了し、それを終了ページに移動します。
-
_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を拡張し、次のメソッドをオーバーライドするだけです
-
processFinish-ユーザーが「_finish」という名前の送信ボタンをクリックすると起動します。
-
processCancel –ユーザーが「_cancel」という名前の送信ボタンをクリックすると起動します。
-
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に移動します。

2. Page1Form.jspには、「ユーザー名」テキストボックスフィールドと2つのボタンが含まれています。
-
「次へ」ボタン-Page2Form.jspに移動します。
-
「キャンセル」ボタン-WelcomePage.jspに移動

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

3. Page2Form.jspには、「パスワード」フィールドと3つのボタンが含まれています。
-
「前へ」ボタン-Page1Form.jspに移動します。
-
「次へ」ボタン-Page3Form.jspに移動します。
-
「キャンセル」ボタン-WelcomePage.jspに移動します。

4. Page3Form.jspには、「備考」テキストボックスフィールドと3つのボタンが含まれています。
-
「前へ」ボタン-Page2Form.jspに移動します。
-
「終了」ボタン-ResultForm.jspに移動します。
-
「キャンセル」ボタン-WelcomePage.jspに移動します。

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

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