我了解MVC模式以及Spring MVC如何实现它。
但是,Rest controller
、Data Access Layer
和Service Layer
如何适应这种模式?
是吗:
-
模型 = 数据库(例如 Oracle/MySQL)和存储库类
-
控制器 =
Service
(业务逻辑)和 RestController
类 -
视图 =
JSP
/FreeMarker
?
模型 - 不是数据库,不是存储库,不是实体。模型是抽象的,包含需要显示的所有数据。每个View
都有自己的模型。您可以将Model
视为 Controller
和 View
之间数据的容器。
在弹簧模型中ModelMap
控制器方法的参数。
控制器 - 准备Model
,将其传递给View
。如果模型非常简单,Controller
可以自己完成。
但大多数模型都包含大量数据。这可以是来自数据库的多个实体、来自配置的数据等。在这种情况下,控制器使用较低级别的层:Service
、Repository
。它们都有助于Сontroller
建立View
模型。
upd:Controller
的目的就是连接View
和Model
。 Controller
创建并填充Model
,然后选择View
并将创建的Model
传递给View
。这就是模型和视图建立联系的方式。
在弹簧控制器是Controller
和RestController
。
视图 - 是向用户显示来自Model
(由Controller
传递)的数据的最终点。但是View
的另一个作用是从用户那里获取命令,并将其传递给Controller
。
在 Spring 中,这可能是任何视图引擎的视图:JSP
、Freemaker
、Thymeleaf
。
注意:通常,Controller
不直接使用Repository
。传统上,Controller
使用Service
,Service
使用Repository
从数据库中获取数据。所以关系如下:View
<- Controller
-> Service
-> Repository
控制器接受HTTP请求,并经常加载或保存一些数据(来自服务或DAO),并返回HTTP响应。此响应可以是重定向、视图、某些 JSON 或二进制文件。
控制器可以使用服务,但应避免拥有自己的太多逻辑。如果不需要服务逻辑,它还可以直接使用数据访问对象。
模型是视图完成其工作所需的任何信息。它不一定与数据库相关。例如,您可以在注册表单中有一个模型,其中包含电子邮件地址和确认电子邮件地址字段。您没有在数据库中存储 confirmEmailAddress 字段,因此数据库表和模型之间没有一对一的关系。此外,模型可以是未保留的简单计算的数据。
所以让我确保我理解...
用户与界面交互以查看或提交数据。用户调用接口以查看一些数据。该调用(HTTP 请求)将转到调度程序 Servlet (DS)。
然后,DS 会查阅处理程序映射,以帮助它决定使用哪个控制器。
选择后,DS 将请求传递给控制器,控制器根据 GET 或 POST 调用适当的服务方法。Service 方法可能需要与存储库交互,存储库可以与非易失性存储(数据库、XML 文件、文本文件等)交互,以基于定义的业务逻辑构建模型。完成后,模型数据将返回到 DS。
然后,DS 会咨询视图解析程序,以确定应使用哪个视图。视图解析程序为请求选取定义的视图。
然后,DS 将请求转发到视图上,该视图将呈现给用户。