Рубрики
Без рубрики

Spring MVC обрабатывает многостраничные формы с помощью AbstractWizardFormController

– Весенний MVC обработка многостраничных форм с помощью AbstractWizardFormController

В последнем примере Spring MVC для обработки форм мы должны использовать SimpleFormController для обработки отправки одностраничной формы, что довольно просто и просто.

Но иногда вам может потребоваться иметь дело с ” wizardform “, для которого требуется обработать форму на нескольких страницах и попросить пользователя заполнить форму постранично. Основная проблема в этой ситуации с волшебной формой заключается в том, как хранить данные модели (данные, заполненные пользователем) и переносить их на несколько страниц?

Abstractwizardformконтроллер

К счастью, Spring MVC поставляется с классом AbstractWizardFormController , позволяющим легко обрабатывать эту форму мастера. В этом уроке мы покажем вам, как использовать AbstractWizardFormController класс для хранения и переноса данных формы на несколько страниц, применения проверки и отображения данных формы на последней странице.

1. Страницы форм Мастера

5 страниц для этой демонстрации, работайте в следующих последовательностях:

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

С помощью AbstractWizardFormController последовательность страниц определяется “именем” кнопки отправки:

  1. _финиш: Заполните форму мастера.
  2. _cancel: Отмените форму мастера.
  3. __target: Перейдите на целевую страницу, где x – индекс страницы с нулевым значением. например, _target0 , _target1 и т. Д.

1. Страница приветствия.jsp Страница приветствия с гиперссылкой для запуска процесса создания формы мастера.



	

Handling multipage forms in Spring MVC

Click here to start playing - AbstractWizardFormController example

2. Страница 1 Форма.jsp Страница 1, с текстовым полем “имя пользователя”, отображает сообщение об ошибке, если таковое имеется, и содержит 2 кнопки отправки, где:

  1. _target1 – перейти на страницу 2.
  2. _cancel – отмените процесс создания формы мастера и переместите его на страницу отмены
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>






	

Page1Form.jsp

Username :

3. Страница 2 Форма.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. Страница 3 Форма.jsp Страница 3, с текстовым полем “примечание”, отображает сообщение об ошибке, если таковое имеется, и содержит 3 кнопки отправки, где:

  1. _target1 – перейти на страницу 2.
  2. _ завершить – завершите процесс создания формы мастера и переместите ее на страницу “Готово”.
  3. _cancel – отмените процесс создания формы мастера и переместите его на страницу отмены.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>






	

Page3Form.jsp

Remark :

5. Форма результатов.jsp Отображает все данные формы, собранные с предыдущих 3 страниц.



	

ResultForm.jsp

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

2. Модель

Создайте класс модели для хранения данных формы.

Файл: User.java

package com.mkyong.common.model;

public class User{
	
	String userName;
	String password;
	String remark;
	
	//getter and setter methods
}

3. AbstractWizardFormКонтроллер

Расширяет AbstractWizardFormController , просто переопределяя следующие методы

  1. processFinish – Срабатывает, когда пользователь нажимает кнопку “Отправить” с именем ” _finish “.
  2. processCancel – Срабатывает, когда пользователь нажимает кнопку “Отправить” с именем ” _cancel “.
  3. Формирующий объект – Используйте класс модели “Пользователь” для хранения всех данных формы на нескольких страницах.

Файл: UserController.java

package com.mkyong.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.mkyong.common.model.User;
import com.mkyong.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");
	}
}

Простой контроллер для возврата представления ” Страница приветствия “.

Файл: WelcomeController.java

package com.mkyong.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.mkyong.common.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import com.mkyong.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);
	}
}

Файл: User.properties – Свойства для хранения сообщения об ошибке

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

И, в контроллере формы мастера ( UserController.java ), переопределите страницу проверки () , вызвав средство проверки вручную (больше никаких объявлений, таких как простой контроллер форм).

Смотрите обновленную версию 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() используйте функцию ” переключатель “, чтобы определить, какая страница вызывается, и связать ее с соответствующим средством проверки. Страница находится в 0-индексированном состоянии.

5. Конфигурация пружины

Объявите контроллер формы мастера ( UserController.java ), расположите все страницы в правильном порядке и зарегистрируйте валидатор.

	
    	   
		
		
		Page1Form 
		Page2Form 
		Page3Form 
		
	   
	   
		
	   
       

Смотрите полный пример:



 
    
      
    
    	
	   
		
		Page1Form 
		Page2Form 
		Page3Form 
	   
	   
	   
		
	   
      
 
      
      
	   
      
	
      
           
                /WEB-INF/pages/
           
           
                .jsp
           
       

5. Демонстрация

URL: http://localhost:8080/SpringMVC/welcome.htm

1. WelcomePage.jsp , нажмите на ссылку, перейдите на Страницу 1 Формы.jsp .

2. Страница 1 Форма.jsp , содержит текстовое поле “имя пользователя” и 2 кнопки:

  1. кнопка “далее” – перейти на страницу 2form.jsp.
  2. ” кнопка “отменить” – перейти на страницу приветствия.jsp

Если при отправке формы “имя пользователя” пустое, отобразите сообщение об ошибке.

3. Страница 2 Форма.jsp , содержит поле “пароль” и 3 кнопки:

  1. кнопка “предыдущий” – перейти на страницу 1form.jsp.
  2. кнопка “далее” – перейти на страницу 3form.jsp.
  3. ” кнопка “отмена” – перейти на страницу приветствия.jsp.

4. Страница 3 Форма.jsp , содержит текстовое поле “примечание” и 3 кнопки:

  1. кнопка “предыдущий” – перейти на страницу 2form.jsp.
  2. кнопка “готово” – перейти к форме результатов.jsp.
  3. ” кнопка “отмена” – перейти на страницу приветствия.jsp.

5. Форма результата.jsp , отображает все данные формы.

Скачать Исходный Код

Рекомендации

  1. абстрактныйwizardformcontroller Javadoc
  2. Пример обработки формы Spring MVC

Оригинал: “https://mkyong.com/spring-mvc/spring-mvc-handling-multipage-forms-with-abstractwizardformcontroller/”