模型 - 视图 - 控制器,每个部分真正做什么?

时间:2013-10-28 09:05:48

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

大家好,我最近开始探索Spring MVC,因为目前我参与了一个使用它的项目。在此之前,我检查了Struts 2框架。但是,在我看来,两个框架的工作有不同的定义和MVC设计模式的实现,AngularJS,作为客户端MVC框架也有它自己的。 我将解释我在Spring MVC和Struts 2之间注意到的差异。

春天:(引自Spring in Action

1-控制器: 在Spring中,控制器是一个处理请求的组件,执行一些逻辑(理想情况下,这个逻辑应该被提取到某个服务或业务逻辑类)并返回数据。

DispatcherServlet的工作是将请求发送到Spring MVC控制器。 控制器是处理请求的Spring组件。但是一个典型的应用 可能有几个控制器和DispatcherServlet需要一些帮助决定 哪个控制器发送请求。所以DispatcherServlet咨询一个或 更多处理程序映射,以确定请求的下一站将在何处。汉族 dler映射会特别注意请求所携带的URL 做出决定。“p166

2- Model:是需要传回给用户并在浏览器中显示的一些信息。

“控制器执行的逻辑通常会产生一些需要的信息 被带回用户并显示在浏览器中。这个信息是 被称为模型。“

3- View :这是HTML + CSS与模型信息相结合的最明显的一个。

现在让我们看看Struts 2如何做MVC

Struts2:(引自Struts 2 in Action)

1- Controller:控制器是一个将URL映射到适当的动作的组件,动作在struts中实现模型? (在春天,这不是控制器所做的)。 Struts只有一个控制器,它是FilterDispatcher。在Spring中,这是由DispatcherServlet完成的,它们不会调用控制器!

“控制器的工作是将请求映射到 动作“

“Struts 2 FilterDispatcher扮演控制器的角色” p13

2- Model:struts中的模型是一个将业务日志和一些数据模型结合在一起的组件,这使得应用程序处于状态。

“模型由Struts 2实现 行动组成部分“ p13

“在更多技术术语中,模型是应用程序的内部状态 state由数据模型和业务逻辑“ p14

组成

所以struts中的模型不仅是User,Contract,Order等数据模型,它还包含应用程序的逻辑。

以下是这两本书中所示的字符串和struts 2的两个图: Spring MVC enter image description here

Struts 2

enter image description here

现在,哪个MVC是正确的MVC?

前端控制器MVC是谁彼此相关的?

提前感谢您的回答。

3 个答案:

答案 0 :(得分:4)

根据这个wiki链接。 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller。 MVC是一种设计模式,其中Model包含业务数据,验证规则,而不是业务逻辑(据我所知)。

2- Model:The model, in struts, is a component that hold business log and some data model together this make the application state.

模型是setter和getter的简单pojos。除了验证规则之外,我从未在模型数据中使用过业务逻辑。

Controller(弹簧)/ Action类(struts)是控制模型数据和视图的控制器。即它是接收模型的中心点,在调用服务层时进行更新,并根据配置以适当的视图进行响应。

view - 只是用户在成功/失败响应时会看到的最终输出。

Dispatcher servlet和Filterdispatchers是url映射处理程序,用于标识其控制器(注入模型数据和处理程序)并接收视图。

在地面上,弹簧和支柱都遵循Controller,Model和View应该做的基础知识。总结spring和struts都使用MVC模式,因为这两个框架之间的实现逻辑不同。

答案 1 :(得分:4)

我这样想。

模型:存储和检索数据;对所有使用它的应用程序强制执行必须一致的策略,称为“业务逻辑”。 (例如:年龄必须> 18岁。)

查看:向用户显示数据;为用户提供了与系统交互的机制。

控制器:介于模型和视图之间;实施特定于此应用程序的策略(例如,清理输入),有时与“业务逻辑”混淆。 (示例:age必须是只包含数字的字符串,以下是解析它的方法。)

我看到两种常见的MVC,一种用于桌面UI,另一种用于Web UI。

Web MVC:Controller处理请求,更新和/或查询Model,选择View模板,将Model与View模板合并。

桌面MVC:Controller解释用户手势,更新和/或查询模型;模特大火“我改变了!”事件; View订阅“我已经改变了!”事件要自我更新。

Spring对Controller的描述使其与Martin Fowler在他的书“企业应用程序架构模式”中称之为“事务脚本”的内容相混淆。我理解这一点,因为我们经常将Transaction Scripts实现为Controller类型的操作。具有讽刺意味的是,Struts比Spring更鼓励(或至少鼓励)这一点。

“动作实现Struts中的模型”听起来像完全疯狂。我只能认为这是一个错误。

最后,Front Controller是一个中央请求处理程序,它将请求分派给更具体的控制器。在桌面应用程序中,我们可以将“TransferFundsController”直接连接到“TransferFundsAction”按钮,因此我们不需要Front Controller。在Web应用程序中,我们对所有请求都有一个单一的入口点,并且我们有很多常见行为(例如,解析请求参数),因此我们经常需要Front Controller来完成所有这些操作。

我希望这会有所帮助。

进一步阅读:

Smalltalk-80(TM)中的应用程序编程:如何使用模型 - 视图 - 控制器(MVC)http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html

http://c2.com/cgi/wiki?ModelViewControllerHistory

答案 2 :(得分:1)

我可以告诉你如何在我的Web应用程序中使用Struts的MVC结构:

查看:JSP + CSS +您可能需要的一些脚本

控制器:在这里,我执行HTTP GET / POST,以及通过使用代码解释每个操作。例如,注销按钮具有代码1,它通过Form类从JSP映射到Java。该值通过JS脚本从View发送到Controller。

模型:这就是魔术发生的地方。模型负责处理整个业务逻辑。无论您需要处理什么样的东西,无论您需要进行何种计算或数据转换,这都是一切都会失败的。

这是MVC基于我自己的经验所做的一个非常实际的例子,我认为这比阅读一堆关于它的理论更容易理解。但这一切有什么意义呢?在服务器端进行尽可能多的处理。通过采用这种MVC结构,您将避免在JS中编写可能复杂的函数,而是在旧的Java中进行编程。我发现这是一个很大的优势,因为我不喜欢JS。

话虽如此,我相信您的Struts 2图表是正确的MVC。

我确信关于MVC及其好处还有很多话要说,但我希望无论如何我的答案对你有帮助。