Spring MVC控制器 - 将逻辑从视图中分离出来

时间:2016-01-25 14:23:29

标签: spring spring-mvc model-view-controller

大型项目中Spring MVC中控制器的实际任务是什么? 他们应该

  1. 获取特定于用例的数据,对其执行视图相关逻辑并将其传递给视图。大型控制器,JSP中的表示逻辑更少
  2. 获取可能需要的所有数据并将一些带有惰性方法的DTO传递给视图,小型控制器,大型JSP
  3. 让我们说我们有一个在线商店,并希望实现showProduct()。 我们有很多显示逻辑依赖于某些DTO的某些属性。例如,在JSP中,我们经常有一些与此

    等效的显示逻辑
    <c:if test="${product.isSameDayPickupSupported && warehouse.stock > 10 && configuration.sameDayPickupEnabled && !soldOut}">
        <div class="sameDayPickup">some HTML goes here</div>
    </c:if>
    

    在我看来,这是将逻辑从JSP中拉出来并让控制器处理这个问题的候选者。最后我们将在JSP中使用它:

    <c:if test="${sameDayPickup}">
        <div class="sameDayPickup">some HTML goes here</div>
    </c:if>
    

1 个答案:

答案 0 :(得分:1)

都不是。您的视图应该尽可能地愚蠢(例如,您应该能够轻松地为它们提供虚拟数据以进行开发),并且您的控制器应该是HTTP前端(HTML / JSON / XML)和服务层之间的薄层。包含您的所有业务逻辑。这使得对业务逻辑和控制器的测试变得简单,并确保您可以在前端的多个变体中可靠地重用业务逻辑。

在这种特定情况下,确定是否提供某个送货选项的规则肯定属于服务层(服务对象或域对象上的方法,具体取决于组织上最有意义的内容)。该逻辑不应该被复制到控制器或视图中。