我如何检查用户是否已将以前的表单正确提交到考虑某些步骤的 Spring MVC 应用程序中?

How can I check if the user have correctly submitted the previous form into a Spring MVC application that contemplate some steps?

我是 Spring MVC 的新手,遇到以下情况。

我正在开发一个实现用户注册过程的 Spring MVC 应用程序。该过程分为4个步骤。在每个步骤中,用户将一些信息插入到提交的表单中,并由相关方法处理到控制器中 class。这些控制器方法中的每一个都采用包含已提交表单信息的相关命令对象。

所以我有这样的东西:

@Controller
public class RegistrazioneController {

    // This is the first step and show a view that contain the first form:
    @RequestMapping(value = "/registrationStep1")
    public String registrationStep1(Model model) {
        return "/registrazione/registration-step1";
    }

    @RequestMapping(value = "/registrationStep2", method = RequestMethod.POST)
    public String registrationStep2(@ModelAttribute RegistrationStep1 registrationStep1, Model model) throws APIException {
        .......................................................
        .......................................................
        .......................................................
        return "/registrazione/registration-step2";
     }

    @RequestMapping(value = "/registrationStep3", method = RequestMethod.POST)
    public String registrationStep3(@ModelAttribute RegistrationStep3 registrationStep3, Model model) throws APIException {
        .......................................................
        .......................................................
        .......................................................
        return "/registrazione/registration-step3";
     }

     // This method return the final view after the completation of the user registration:
     @RequestMapping(value = "/registrationStep4", method = RequestMethod.POST)
    public String registrationStep2(@ModelAttribute RegistrationStep4 registrationStep4, Model model) throws APIException {
        .......................................................
        PERFORM THE USER REGISTRATION
        .......................................................
        return "/registrazione/registration-step4";
     }

}

所以它工作得很好。我的问题是应用程序在进入注册步骤时检查是否已完成前面的步骤(之前的表格已编译并提交)。

所以我认为我必须做这样的事情,例如:** 当进入 registrationStep3() 时必须检查前一个 registrationStep2()步骤方法设置正确(有效),说明用户已经完成了前面的注册步骤。

应用程序必须防止用户在未完成注册过程的前面步骤的情况下尝试从一个步骤开始访问注册。

实现此行为的最佳方法是什么?

我在一些 Sap Hybris 项目中工作过,这个平台建议使用以下流程:

Step1Form、Step2Form 和 Step3Form,如果您在第一步表单中有名字和姓氏,您将在 Step1Form class 中具有相同的属性。

并为每个 class 创建一个验证器,在下一步控制器中,如果它无效,您必须验证上一步,将用户重定向到上一步。

您已经有 RegistrationStep1、RegistrationStep2 和 RegistrationStep3 让我们为 RegistrationStep1 创建一个验证器:

import org.apache.commons.validator.routines.EmailValidator;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

@Component(value = "registrationStep1Validator")
public class RegistrationStep1Validator implements Validator
{

    @Override
    public boolean supports(final Class<?> aClass)
    {
        return RegistrationStep1.class.equals(aClass);
    }

    @Override
    public void validate(final Object object, final Errors errors)
    {
        final RegistrationStep1 step1= (RegistrationStep1) object;
        final String name = step1.getName();
        final String email = step1.getEmail();

        if (email.isEmpty or email == null)
        {
            errors.reject("email", "Email must not be blank or null");
        }

        if (name.isEmpty or name== null)
        {
            errors.reject("name", "Name must not be blank");
        }



        if (!EmailValidator.getInstance().isValid(email))
        {
            errors.reject("email", "Email must be valid");
        }
    }

}

//稍后在你的控制器中

@RequestMapping(value = "/registrationStep2", method = RequestMethod.POST)
    public String registrationStep2(@ModelAttribute RegistrationStep1 registrationStep1,final BindingResult bindingResult, Model model) {

        registrationStep1Validator.validate(registrationStep1,bindingResult);
        if (bindingResult.hasErrors())
        {
            return "/registrazione/registration-step1";
        }
        return "/registrazione/registration-step2";
     }