【发布时间】:2022-01-09 01:43:43
【问题描述】:
我正在使用 Spring MVC 框架构建一个应用程序,并且存在一个我无法明确解决的架构问题。我的问题是我不完全理解应用程序的哪个部分(层)应该负责控制流(流控制是指连续视图的显示 - 页面)。
Spring MVC 中的控制器是视图和应用程序之间的某种适配器。另一方面,服务是基于业务逻辑实现的。
假设我们有一个支持某个端点的控制器:
@GetMapping("/goToPageBasedOnLogic")
public ModelAndView passParametersWithModelAndView() {
ModelAndView modelAndView = null;
// business logic calculates some stuff...
if(fooService.bar()) {
modelAndView = new ModelAndView("viewPageHello");
modelAndView.addObject("message", "hello");
}
else {
modelAndView = new ModelAndView("viewPageGoodbye");
modelAndView.addObject("message", "goodbye");
}
return modelAndView;
}
在上面的示例中,控制器根据 fooService 的结果决定显示哪个视图,从而管理控制流。如果条件多,可能会导致控制器代码难看。
让我们考虑下一个例子:
@GetMapping("/goToPageBasedOnLogic")
public ModelAndView passParametersWithModelAndView() {
ModelAndView modelAndView = null;
session.fooBarResult = fooService.bar(); // logic calculates some stuff and saves in session
State newState = stateMachine.sendEvent(PAGE_FINISHED_JOB);
if(newState == State.PAGE_HELLO) {
modelAndView = new ModelAndView("viewPageHello");
modelAndView.addObject("message", "hello");
}
else {
modelAndView = new ModelAndView("viewPageGoodbye");
modelAndView.addObject("message", "goodbye");
}
return modelAndView;
}
在此示例中,根据服务和业务逻辑决定显示哪个视图。状态机接收到事件,然后根据会话和编码条件,决定选择下一个视图。然后控制器根据新状态准备正确的视图并返回它。控制器对控制流逻辑一无所知。
决定是否显示下一个视图(页面)的解决方案哪个更好?还有其他更有趣的解决方案吗?
【问题讨论】:
标签: spring spring-mvc model-view-controller design-patterns architecture