【问题标题】:Spring MVC controllers - separating logic from viewSpring MVC 控制器 - 将逻辑与视图分离
【发布时间】:2016-01-25 14:23:29
【问题描述】:

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

  1. 获取用例特定数据,对其执行与视图相关的逻辑并将其传递给视图。大型控制器,JSP 中的表示逻辑更少
  2. 获取所有可能需要的数据,并将一些具有惰性方法的 DTO 传递给视图、小型控制器、大型 JSP

假设我们有一个在线商店并且想要实现 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 是更好的选择。此外,尝试将尽可能多的“业务”逻辑放在控制器之外的层中。例如,如果使产品“下线”需要对外部服务进行三次调用,则将这三个调用放入控制器调用的新层中。
  • 你应该把你的business-logic放在service层。另外,您能否用简短而准确的词语更恰当地重新构建您的问题。
  • 嗨@WeareBorg - 我重新提出了我的问题,希望能澄清我的意图。谢谢
  • 大项目或小项目,控制器的任务保持不变。您可以将数据分解为多个部分,并可以通过控制器提供服务,但我仍然不明白您想知道什么。此外,这些天来,不仅有 JSP,开发人员使用 JS 等作为前端,但同样,除了从控制器方法获取数据之外,这与控制器有什么关系。
  • 嗨,我认为我的代码示例会很清楚。我指的只是显示逻辑。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 2015-05-15
    • 2012-09-17
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2012-10-23
    • 2012-03-22
    相关资源
    最近更新 更多