MVC是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVC是啥?相关的知识,希望对你有一定的参考价值。

只有struts中能够应用MVC吗?MVC到底是怎么个过程?

不是,struts只是实现MVC的一种代表性的框架。
MVC概述:
MVC是Model-View-Controller的简称,即模型-视图-控制器。MVC是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用,最近几年被推荐为Sun公司J2EE平台的设计模式,受到越来越多的Web开发者的欢迎。
MVC设计模式:
MVC是一种设计模式,它强制性地把应用程序的输入、处理和输出分开。MVC把应用程序分成三个核心模块:模型、视图和控制器,它们分别担负不同的任务。
MVC处理过程:
首先控制器接受用户的请求,并决定应该调用哪个模型来进行处理;然后模型根据用户请求进行相应的业务逻辑处理,并返回数据;最后控制器调用相应的视图来格式化模型返回的数据,并通过视图呈现给用户。
MVC的优缺点:
1. MVC的优点
1) 可靠性(Reliability):将表示层和处理层完全分开,可以在不重新编译model和controller的情况下修改view层。
2) 复用性和适应性(reuse & adaptability):MVC使你可以使用多种view去访问相同的model。
3) 快速开发(Rapid deployment):因为MVC清晰的将表示层和处理层分开,所以使得不同的程序员可以各司其则,增加开发速度。
4) 可维护性(Maintainability):清晰的分层同样使得代码清晰、程序的可维护性提高。
2. MVC的缺点
MVC的设计实现并不十分容易,理解起来比较容易,但对开发人员的要求比较高。MVC只是一种基本的设计思想,还需要详细的设计规划。模型和视图的严格分离可能使得调试困难一些,但比较容易发现错误。实验表明,MVC由于将应用分为三层,意味着代码文件增多,因此,对于文件的管理需要费点心思。
Struts概述
Struts实质上就是在JSP MODEL2的基础上实现的一个MVC框架。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组建构成,控制器由ActionServlet和Action来实现,视图由一组JSP文件构成。
对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。
当ActionServlet接收到一个客户请求时,将执行如下流程。
1) 检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
2) 如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
3) 根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
4) 如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。如果ActionForm的validate()方法返回一个包含一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件,在这种情况下,不会再创建Action对象并调用Action的execute()方法。
5) ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
6) Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件。
7) ActionForward对象指向的JSP组件生成动态网页,返回给客户。
参考技术A MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 php 的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
MVC如何工作

MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。

视图
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由html元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Macromedia Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.

如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

模型
模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

控制器
控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。

现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

为什么要使用 MVC

大部分Web应用程序都是用像ASP,PHP,或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。

首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。

由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。

因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从mysql移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互对立,改变其中一个不会影响其它两个,所以依据这种设计思想你能构造良好的松偶合的构件。

对我来说,控制器的也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。

MVC的缺点
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。

你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。

根据我个人经验,由于我们将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而易见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。

MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

MVC是一条创建软件的好途径
MVC设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。
参考技术B MVC(模型Model-视图View-控制器Controller)是一种设计模式,
MVC。V即View.是视图的意思。C即Controller.是控制器的意思。而M即Model,是模型的意思。这三个里.最不容易理解的应该是Model.就是什么是Model,而为什么叫Model。我先不说为什么叫Model,先解释Controller。
Controller是控制器的意思,所谓控制器,就是将用户请求转发给模型层,经过处理后把结果返回到界面层展现的一个中间层,那么Controller到底管什么工作呢?先不说.先来看下在Java
Web中这三个层一般的定义,一般在Java
Web里,JSP充当V,Servlet充当C,JavaBean充当M,这里的Servlet管什么工作呢?接受输入,转到Model层去处理,处理结果保存后转发到JSP,然后展现数据。所以它的功能就是控制器的基本功能,它就管转发,在V和M之间转来转去。
再来说说M,即Model,在Java
Web里说的是JavaBean,我认识的很多人都把JavaBean误认为是实体类,其实JavaBean有比实体类更丰富的定义,在JavaBean中除了其属性和字段,还可以有行为及其事件,JavaBean可以理解为普通Java对象。Java普通对象,就是符合Java规范的所有对象,这和实体类完全是两回事。所以,我认为在MVC中。业务逻辑和数据访问应该放在Model层,也就是V负责展示数据,Controler除了转发不做业务逻辑。真正的逻辑事务,数据访问,甚至算法都放到Model去。
  MVC没有把业务的逻辑访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。当然了。在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是已实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。
参考技术C struts 当然可以用MVC模式开发

M:model 模式
V:view 视图
C:control 控制
一般来形容JSP网站的3层结构,model就是底层的数据库,view就是指jsp的页面,control指在两者之间的控制如:javabean、servlet等。
参考技术D mvc,m:模型,简单的话写个javabean ,v视图:一般用jsp c:控制,一般用servlet
struts是mvc的一个代表框架,目前来说是一个比较好的框架

Ruby on Rails 中的 MVC 是啥?

【中文标题】Ruby on Rails 中的 MVC 是啥?【英文标题】:What is MVC in Ruby on Rails?Ruby on Rails 中的 MVC 是什么? 【发布时间】:2010-12-28 05:30:16 【问题描述】:

谁能用 Ruby on Rails 用外行的方式向我解释 MVC。我对理解 MVC 中的模型特别感兴趣(无法理解模型)。

【问题讨论】:

【参考方案1】:

我认为了解 MVC 的最佳方式是通过示例。尝试使用 MVC 编写一个简单的 Rails 应用程序。网上有很多教程,比如the blog example at "Getting Started with Rails"。

如果选择通过编写示例来学习,请查看Where can I find clear examples of MVC?的答案

【讨论】:

【参考方案2】:

您的模型是您的程序使用的数据结构。

视图是与屏幕交互的部分或上一层。

Controller 一般处理模型和视图之间的数据

MVC 结构通常是嵌套的,因此“模型”或“视图”可能包含自己的 MVC(想想屏幕上的组件。您可能只是用字符串填充它,但在幕后是组件的代码绘制自己的小视图,拥有自己的小模型(您传入的字符串),并有一个小控制器将数据绘制到视图上。

在 Rails 中,模型、视图和控制器的角色由框架明确定义,任何教程都会在引导您完成创建的文件时指出这三个组件。

在其他系统中,这些部分可能更难识别。此外,MVC 并不是“完美的”,请记住,有有效的替代方案,但它是开始组织的好方法。

【讨论】:

【参考方案3】:

MVC 不仅仅适用于 Ruby on Rails。它实际上是在 Ruby on Rails 出现之前创建的。它主要只是一种组织代码的方式,以便您拥有一些负责模型的代码(数据库表的 Class 版本),一些负责您的视图的代码(视觉上显示给用户的内容)和负责的代码对于您的控制器(将视图与模型联系起来并执行大部分逻辑。

这是非特定于框架的描述。每个使用 MVC 的框架都有不同的实现方式。对于 Ruby on Rails,每个模型都将数据库表表示为一个类,该类可以直接在代码中与其他对象进行通信,而无需编写任何 SQL。所有的 SQL 都在后台处理,你只需要把它想象成一个普通的类(差不多,它还不是无缝的)。视图主要是 HTML,表示将发送到浏览器的内容。控制器只是将模型和视图通信在一起的代码。

总而言之,MVC 不仅仅针对 Ruby on Rails……它只是最流行的。

【讨论】:

【参考方案4】:

一些背景知识,MVC 是一种(复合)设计模式,由 Trygve Reenskaug(Smalltalk)于 1979 年开发。

真正的 MVC 最初计划用于 n 层(非 Web)系统,它将系统拆分为 3 个不同的部分,即模型、视图和控制器

模型

包含应用程序的数据(通常链接到数据库) 包含应用程序的状态(例如客户有什么订单) 包含所有业务逻辑 通知视图状态变化(** ROR 不正确,见下文) 不了解用户界面,因此可以重复使用

观点

生成向用户呈现数据的用户界面 被动,即不进行任何处理 一旦数据显示给用户,视图工作就完成了。 许多视图可以出于不同的原因访问同一个模型

控制器

接收来自外部世界的事件(通常通过视图) 与模型交互 向用户显示适当的视图

** 经典 MVC 不适合 Web 应用程序,因为模型无法以观察者的方式将所有更改发送到视图(视图是网页)。上世纪 90 年代,JSP 团队引入了 Model2 来克服不断变化的基础架构。 MVC Web 框架实际上不是 MVC,而是 Model2(Ruby on Rails 也是如此)。

这里是来自大师 Martin Fowler 对包括 MVC 在内的 GUI 模式的描述 GUI Architectures

到目前为止我找到的最好的书是Agile Web Development with Rails。它从假设没有知识开始,并且非常全面。

希望这对您有所帮助!

【讨论】:

从它的创建者那里阅读 MVC 总是很好的,然后认识到它并不真正适用于 Web 应用程序。你可以阅读更多heim.ifi.uio.no/~trygver/2007/MVC_Originals.pdf 这是一个很好的通用答案,但与 Ruby on Rails 无关。请参阅此链接以获得更好的答案:tutorialspoint.com/ruby-on-rails/rails-framework.htm Ruby on Rails 在“视图”和“控制器”之间没有任何真正的分离。视图在控制器的上下文中执行,并且实际上与控制器代码相同(除了语法不同)。这就是为什么@var 总是有效的原因,并且与许多其他框架明显不同,在这些框架中,视图的执行与控制器完全分开。【参考方案5】:

Ruby on Rails 没有实现 MVC 设计模式。 Ruby on Rails 具有称为控制器、模型和视图的文件夹。视图文件夹包含 HTML 文件。控制器和模型文件夹有 ruby​​ 文件。控制器映射到一个 URL,并且控制器中的一个方法在请求该 URL 时执行,相关的视图(HTML 文件)被加载,并且它的模型(数据结构)用于填充视图。这就是它与 MVC 设计模式的相似程度。人们说它是 MVC 很可惜,因为它引起了一代人对 MVC 设计模式的困惑和误解。

在 Rails 中,模型是一种数据结构。

【讨论】:

【参考方案6】:

MVC 基本上表示模型-视图-控制器。并且 MVC 被 PHP、Perl、Python 等许多语言使用。通常 MVC 是这样工作的:

请求首先到达控制器,控制器找到合适的视图并与模型交互,模型与您的数据库交互并将响应发送给控制器,然后控制器根据响应将输出参数提供给视图。

【讨论】:

这些图表让我很恼火的一点是,它在解释模型如何在视图和控制器之间传递时并不公平。它看起来好像模型是一个单独的实体,但它实际上是在视图和控制器之间传递的数据包。控制器技术上控制服务器上模型发生的事情;在这种情况下,从数据库加载数据。当控制器真正发出这个调用时,图表看起来像是模型负责这个(有逻辑这样做)。【参考方案7】:

以下是关于 MVC 模式如何工作的简要概述:

控制器:

    侦听某种交互/事件流。 控制器可以向模型发送该类型的交互/事件。 控制器也可以与视图通信。

型号:

    模型将监听来自控制器的交互/事件。 是数据源的抽象。 处理数据逻辑和操作。 完成逻辑后,它会发送到控制器,然后控制器将与视图进行通信。

查看:

    View 可以与控制器通信。 知道如何将数据从模型以可视方式呈现到浏览器。 Controller 告诉 View 使用来自 型号。

需要注意的一点是模型不能直接与视图通信,反之亦然。只有控制器可以与视图和模型通信,因此控制器充当从浏览器上的用户交互中检索到的交互/事件的委托者。

check this link for more clear understanding

one more link to get clear

【讨论】:

【参考方案8】:

模型视图控制器原则将应用程序的工作划分为 3 个独立但密切合作的子系统。

模型(ActiveRecord):

它维护对象和数据库之间的关系,并处理验证、关联、事务等。

该子系统在 ActiveRecord 库中实现,该库在关系数据库中的表和操作数据库记录的 Ruby 程序代码之间提供接口和绑定。 Ruby 方法名由数据库表的字段名自动生成。

视图(ActionView):

它是以特定格式呈现数据,由控制器决定呈现数据触发。它们是基于脚本的模板系统,如 JSP、ASP、PHP,并且很容易与 AJAX 技术集成。

此子系统在 ActionView 库中实现,该库是一个基于嵌入式 Ruby (ERb) 的系统,用于定义数据表示的表示模板。每个到 Rails 应用程序的 Web 连接都会显示一个视图。

控制器(ActionController):

应用程序中用于引导流量的工具,一方面,查询模型以获取特定数据,另一方面,将数据组织(搜索、排序、消息传递)成适合用户需求的形式给定的观点。

该子系统在 ActionController 中实现,它是位于 ActiveRecord(数据库接口)和 ActionView(表示引擎)之间的数据代理。

查看以下链接以清楚地了解 Rails 中的 mvc:

http://www.bogotobogo.com/RubyOnRails/RubyOnRails_Model_View_Controller_MVC.php

https://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/

【讨论】:

以上是关于MVC是啥?的主要内容,如果未能解决你的问题,请参考以下文章

MVC 5 上的成员资格提供程序是啥?

mvc+ef 是啥

这些图中箭头的图例是啥(MVC - MVP - MVVM)?

MVC模型中Controller的作用是啥?

MVC / MVP / MVVM 到底是啥?

asp.net mvc是啥概念