16

听说控制器属于表现层。这怎么可能?

我以为 :

  • 视图用于演示
  • 模型用于业务逻辑
  • 控制器用于控制逻辑

是否有很好的链接来证明控制器属于表示层?

《Spring MVC用于表示层》:如何只在表示层使用MVC?

4

3 回答 3

20

表示层包含视图控制器。
您不能将 MVC 架构误认为是多层/层架构(尤其是 3 层架构)。大多数时候模型/视图/控制器不是 Web 应用程序的主要设计,它只是多层/层架构的一个子集。

看看这个过于简单的方案(你可以将 DAO 放在专用的数据访问层中,但这在本文中并不重要):

简化层

Spring MVC 是一个表示框架:它处理控制器和视图。但是为什么 Spring MVC 中的“M”呢?仅仅因为,与许多其他表示框架一样,它自然地处理模型/实体(“M”)的表示。这种表示是在您的控制器中使用的,在您的视图中显示,在您的表单中提交等。这就是为什么框架被称为 Spring MVC,即使模型/实体不是表示层的一部分。

我认为这是这个框架的一个好名字,因为它真的是面向“MVC”的。实际上,模型/实体的表示可以是:

  • direct :框架直接处理模型/实体对象
  • 间接:框架处理一个表单对象或 DTO,其中包含与一个或多个实体相关的信息

Spring 的建议是直接使用模型/实体(“M”)对象:

可复用的业务代码,无需重复。使用现有的业务对象作为命令或表单对象,而不是镜像它们来扩展特定的框架基类。

这就是为什么我说这个框架非常面向“MVC”,与其他框架相比,比如 Struts,你必须使用不同的表单对象。

一些有趣的链接:

于 2012-09-15T21:16:37.843 回答
5

控制器控制表示层逻辑。对于所有业务代码、事务用例、持久性等,它通常委托给服务层。

一种典型的做法是将事务服务实现为 spring bean 并将这些 spring bean 注入控制器中。典型用例:创建新产品:

  1. 控制器从浏览器接收命令 bean
  2. 它验证是否存在所有必需的数据,如果不存在,则重新显示带有错误消息的产品创建页面
  3. 它调用服务 bean 来创建产品
  4. 服务 bean 在事务中运行。它从数据库中获取产品类别,将产品附加到其类别,根据当前定价策略计算产品价格,向外部应用程序发送 JMS 消息,并返回创建的产品的 ID
  5. 控制器使用创建的产品的 ID 作为 URL 参数重定向到产品详细信息页面。
于 2012-09-14T18:19:33.237 回答
2

这在很大程度上取决于您使用的是哪种类型的 MVC,以及您在什么环境中使用它。

例如,ASP.NET MVC 完全是一种 UI 模式,因此所有三个部分都是表示的一部分。

然而,在 MVC 的大多数实现中,Controller 与用户交互,因此是 UI 层的一部分。它可以处理按钮按下和键盘输入……但在许多情况下,控制器还负责将模型和视图连接在一起。

一个普遍的事实是,如果您无法帮助,您不应该在控制器中执行业务逻辑。业务逻辑存在的位置取决于许多因素。在某些实现中它可能是模型的一部分,或者它可能是 MVC 之外的独立层

于 2012-09-14T18:14:09.317 回答