Spring启动表单向导

时间:2016-10-26 07:25:05

标签: java spring spring-mvc spring-boot

我正在尝试编写一个Spring Boot应用程序,它将根据用户输入处理多页表单。

因此,根据用户选择,流程可能会有所不同。

这样的事情:

用户选择Flow A --> FormA1, FormA2, FormA3, FormA4, Done

用户选择Flow B --> FormB1, FormB2, FormB3, Done

正如您所看到的,这些流程中的共享步骤可能只是最后一个(成功)部分,除此之外,所有形式,验证等都将特定于流程。

我的问题是,我可以编写一个WizardController来接受表单列表,每个步骤的验证器,每个步骤的后处理方法,渲染每个步骤的单个模板(或不同的列表)每个步骤的模板)​​所以我可以推广这种模式吗?

这些方面的东西:

@Controller
public class WizardController {
    // This will hold list of form for each step
    private List<Form> formList;
    // A generalised template for each step
    private String template;

    @GetMapping
    public String get() {
        // This will only render the initial form
    }

    @PostMapping
    public String post() {
        // All POST requests will be handled here
        // If validation fails render current step, else next step or done
    }
}

因此,我不是为每个流创建一个控制器,而是使用相同的WizardController。这听起来过度工程吗?如何实现将formList注入我的控制器?我需要BeanFactory来实现这一目标吗? (因为表单对象每次都会有所不同。我对Spring来说很新,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

WizardController不应包含任何内部状态(如表单列表)。

我建议创建一个服务,根据当前用户(例如从SecurityContextHolder.getContext()检索)和之前的表单,为您提供表单。

@Service
public class FormService { /* ... */ }

然后可以将此服务注入控制器:

@Controller
public class WizardController {

    @Autowired
    private FormService formService;

    @GetMapping
    public String get() {
        formService.getInitialForm();
    }

    @PostMapping
    public String post(HttpServletRequest request) {
        // find out which was the last form from
        // some request parameter

        formService.getNextForm(prevForm);
    }
}