【问题标题】:How does Spring MVC relate to Service, Controller and Data Access layers in a web application?Spring MVC 如何与 Web 应用程序中的服务、控制器和数据访问层相关联?
【发布时间】:2016-06-09 00:57:50
【问题描述】:

我了解MVC Pattern 以及Spring MVC 如何实现它。

但是,Rest controllerData Access LayerService Layer 如何适应这种模式?

是吗:

  • 模型 = 数据库(例如 Oracle/MySQL)和Repositories

  • Controller = Service(业务逻辑)和 Rest Controller

  • 查看 = JSP / FreeMarker?

【问题讨论】:

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


    【解决方案1】:

    模型 - 不是数据库,不是存储库,不是实体。模型是抽象的,它包含所有需要显示的数据。每个View 都有自己的模型。您可以将Model 视为ControllerView 之间的数据容器

    在Spring模型中是ModelMap控制器方法的参数。

    Controller - 准备Model,将其传递给View。如果模型很简单,Controller 可以自己做。

    但大多数模型都包含大量数据。这可以是来自数据库的多个实体、来自配置的数据等。在这种情况下,控制器使用较低级别的层:ServiceRepository。他们都帮助СontrollerView建立模型。

    更新:Controller 的目的是连接ViewModelController 创建并填充Model,然后选择View 并将创建的Model 传递给View这就是模型和视图建立连接的方式

    在 Spring 控制器中是 ControllerRestController

    查看 - 来自Model(由Controller 传递)的数据将显示给用户的最后一点。但是View 的另一个作用是从用户那里获取命令,并将其传递给Controller

    在 Spring 中,这可能是任何视图引擎的视图:JSP,Freemaker,Thymeleaf


    注意:通常Controller 不直接使用Repository。传统上,ControllerService 一起使用,Service 使用Repository 从数据库中获取数据。所以关系如下:ViewController->Service->Repository

    【讨论】:

    • 感谢您提供非常详细的答复。除了模型和视图如何连接之外,我几乎都了解?服务类是否改变了模型,然后改变了视图?您能否扩展:Controller->Service->Repository 以包含视图?
    • 服务对模型和视图一无所知。只有控制器知道一切。主控制器的目的是将所有组件相互连接。只有控制器可以更改模型。只有控制器可以要求服务做某事。例如,控制器可以要求服务从数据库中加载实体。之后,控制器会将此实体(或多个实体)添加到模型,并将此模型传递给视图。而View会展示这个Model,但是View甚至不知道,从Controller那里获取存储在Model中的数据。
    • 以及服务不知道控制器获取数据的内容。因此它提供了更少的组件之间的依赖关系。
    • 好的,谢谢。所以本质上是:控制器>服务>存储库/模型>视图?那么视图会传递给浏览器显示吗?
    • 模型不是实体?这令人困惑。我一直在学习 Model = Pojo = Entity。你能澄清一下吗?
    【解决方案2】:

    控制器接受 HTTP 请求并经常加载或保存一些数据(来自服务或 DAO),并返回 HTTP 响应。此响应可能是重定向、视图、某些 JSON 或二进制文件。

    控制器可以使用服务,但应避免拥有太多自己的逻辑。如果不需要服务逻辑,它也可以直接使用数据访问对象。

    模型是视图完成其工作所需的任何信息。它不一定与数据库相关。例如,您可以在注册表单中有一个模型,其中包含电子邮件地址和 confirmEmailAddress 字段。您没有在数据库中存储 confirmEmailAddress 字段,因此数据库表和模型之间没有一对一的关系。此外,您的模型可能是不持久的简单计算数据。

    【讨论】:

    • “模型是视图完成其工作所需的任何信息” - 你能详细说明一下吗?此外,如果您在应用程序中包含 Spring 数据存储库,我认为它将被视为模型层?谢谢你的回答
    • 模型只是对象的映射。这些对象可能是也可能不是实体。如果您使用的是 Spring Data,那么是的,您可能会在模型中添加实体列表,但您也可以在同一个模型中添加其他内容,例如下拉数据。
    • 谢谢,这开始有道理了,就视图而言,它本质上是 JSP 还是类似的东西?我还想知道 MVC 中的视图如何链接到用户查看的浏览器上的实际页面?
    • @java123999 视图层可以是其中之一。 JSP 是一种类型。百里香是另一个。 JasperReports 是另一个。它应该是一个相当愚蠢的层,只显示数据。
    • 谢谢,浏览器上的Javascript和这个视图一点关系都没有?
    【解决方案3】:

    所以让我确保我理解......

    用户与界面交互以查看或提交数据。用户调用界面查看一些数据。该调用(一个 HTTP 请求)转到 Dispatcher Servlet (DS)。

    DS 然后查询处理程序映射以帮助它决定使用哪个控制器。

    一旦选择,DS 会将请求传递给控制器​​,控制器会根据 GET 或 POST 调用适当的服务方法。 Service 方法可能需要与 Repository 交互,Repository 可以与非易失性存储(数据库、XML 文件、文本文件等)交互,以根据定义的业务逻辑构建模型。完成后,模型数据将返回到 DS。

    然后 DS 会咨询应使用哪个视图的视图解析器。 View Resolver 为请求选择一个已定义的视图。

    然后,DS 将请求转发到视图上,然后呈现给用户。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 2017-10-18
      • 2012-06-17
      • 1970-01-01
      • 2021-03-19
      • 2012-01-22
      • 2010-09-25
      • 1970-01-01
      相关资源
      最近更新 更多