我正在尝试编写一个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来说很新,所以任何帮助都会受到赞赏。
答案 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);
}
}