从Web开发者的视角来解读MVC架构

时间: 2019-07-04阅读: 129标签: 架构

MVC代表了一种软件框架的设计模式。该框架的主要功能是:通过允许多名开发人员共同在一个项目上开展工作,以分离应用程序的功能、逻辑和接口,进而促进有组织的编程实现方法。下面,让我们从Web开发人员的角度来解读MVC的不同组件。

首先,让我们来看看有哪些使用到了MVC的流行Web框架:

  • Ruby on Rails (Ruby)
  • Express (JS)
  • Backbone (JS)
  • Angular (JS)
  • Laravel (PHP)
  • Zend (PHP)
  • Codeigniter (PHP)
  • Django (Python)
  • Flask (Python)

接着,我们重点来讨论Ruby on Rails和Codeigniter(PHP)。这两个框架在它们的文件结构中有着不同的文件夹,也就是所谓的模型、视图和控制器。虽然类似并借用了Django for Python的某些概念,但是这两个框架实际上并没有严格的文件夹结构。

此类框架的另一个特点是:同一个框架可能会将其应用程序放置在控制器中,然后将另一部分放置在模型中。因此不少Web开发人员认为MVC架构略显混乱,甚至毫无固定章法可循。不过我个人认为:用户能够采用多种方式来创建MVC架构,正是其亮点与灵活性所在。

下面,我们正式从Web开发者的角度为大家解读MVC的三个组件:模型、视图和控制器。


模型

由于模型部件负责获取和操作数据,因此它一般属于应用程序的“大脑”。通常情况下,它与MySQL之类的关系型数据库,以及MongoDB之类的NoSQL数据库进行交互。不过这并不重要,在支持多种数据库的不同框架中,模型的代码能够一直保持相同。

在实际应用中,我们只需要修改数据库的驱动程序便可,而不必知晓与之协作的数据库类型。例如:您完全可以让自己的模型与JSON文件进行交互,并从中提取数据。而这个简单的JSON文件甚至都不算是一个数据库。

模型不但能够负责诸如SELECT、INSERT、UPDATE和DELETE之类的查询操作,还能够与控制器进行通信。在大多数情况下,控制器可以通过模型来请求数据,并且由控制器来更新视图。不过,通过某些框架,模型也可以直接去更新视图。当然,这显然增加了MVC的复杂性。可见,不同的框架有着截然不同的实现方式。


视图

就视图而言,顾名思义它与应用程序的实际视图有关,也就是我们常说的用户界面。它负责面向用户的显示,以及让用户如何与应用程序进行交互。

因此,视图通常包括:HTML、CSS、以及来自控制器的各种动态值。在应用运行时,控制器会与视图、以及模型保持通信。同样,根据您所选用的框架不同,具体的模板引擎也可能会有所差异。

此处的“模板引擎”是指:某个允许动态数据的工具。如果我们使用的是直接的HTML,那么就不可能有各种输出变量,也无法选用if语句之类的逻辑。但是如果使用了模板引擎,那么我们就可以在视图中、或者是在模板中正确地处理此类动态变量了。

因此,模板引擎的典型示例包括:Handlebars.js(https://handlebarsjs.com/)与Dust.js(https://www.dustjs.com/)。对于Ruby on Rails而言,我们可以使用嵌入式的ERB(https://ruby-doc.org/stdlib/libdoc/erb/rdoc/ERB.html)。而对于Ruby语言,我们也可以使用Haml(http://haml.info/)和针对Python的Flask(http://flask.pocoo.org/)。当然,我们还有其他的选项,比如说JavaScript。


控制器

最后是控制器,它与用户的输入有关。例如:用户在访问页面时点击某个链接,触发了一个GET请求;或者是以提交表单的形式,发送一个POST请求;当然我们也可以发出删除、或提出更新等类型的请求。由于这些动作无法直接从浏览器中生成,因此您只能自行产生一个GET或POST,或者是通过内置在某个框架中的HTTP客户端,来达到该目的。

在此,控制器充当的是模型与视图之间的中间人角色。控制器需要通过模型从数据库中获取某些数据,而控制器在获取到相关数据之后,通过加载视图的方式,将该数据传递给它。接着,模板引擎接管后续的“任务”,实现输出变量之类的逻辑事务。

当然,控制器也可以在不传递数据的情况下加载某个视图。而此处需要有一个带有HTML和CSS的纯Web页面,就不是真实的模板逻辑。

下面是一个非常简单的例子(或称流程图)。


如上图所示,用户可以通过浏览器看到应用程序的视图。

首先,应用程序可以将他们的输入作为某种请求提交给所谓的“路由器”。而且这些请求正是用户通过点击某个链接,所产生并触发的某条路径需求。

接着,“路由器”开始调用基于该路由的特定控制器方法。因此,如果需要使用或获取一些数据的话,控制器需要与模型进行交互,而该模型也会与后台的数据库进行交互。

然后,一旦控制器获得了返回数据,它就需要加载一个视图。而具体的操作过程是:它将数据发送到视图,并由模板引擎来进行处理。

最后,一旦后台操作完成,控制器将把视图发送回浏览器,以供用户查看。


结论

综上所述,我们可以这样来理解MVC架构:模型是某种数据结构,控制器是流量控制器的一种形式,而视图则是用户看到并与之交互的部分。大家各司其职,让程序分工明确、条理清楚。

原文标题:An Introduction to MVC Architecture: A Web Developer's Point of View,作者:Dipen Patel
链接:http://developer.51cto.com/art/201907/598921.htm


链接: http://www.fly63.com/article/detial/4018

如何架构一个中后台项目的前端部分?

不管是前端抑或后端,从零开始做一个新项目避免不了技术选型这一块,其应该也是最先需要考虑的内容,之后的一切都会建立在这之上。这篇文章便主要来谈谈在架构一个中后台系统的前端部分上我的实践点。

MySQL逻辑架构简介

第一层结构主要处理客户端与mysql服务端的连接、授权认证、安全等;第二层是Mysql服务端的核心,功能包括查询解析、分析、优化、缓存等,存储过程、触发器、视图等都在这一层实现;第三层的存储引擎主要负责数据存储和提取

架构师教你如何设计一个高并发系统?大多程序员都收藏了

其实所谓的高并发,如果你要理解这个问题呢,其实就得从高并发的根源出发,为啥会有高并发?为啥高并发就很牛逼?我说的浅显一点,很简单,就是因为刚开始系统都是连接数据库的

Redis高可用,高性能,架构演进史

高性能就是做分片(可以类比为分库分表,将数据分到不同服务器上),在Kafka中叫分区,在mongodb中叫shard,在HDFS上叫DataNode。而保证高可用的方式就是做交叉备份。然后我很好奇Redis是怎么部署的。

业务架构师给你一些建议

搬运工: 付老师讲述了自己成为业务架构师的一些个人经历,并且也给出了学习建议,最后推荐了一些不错的书籍。希望对你成为业务架构师有帮助或者启发,也可以在完成业务开发建模等有所帮助。

高级架构设计师 推荐书籍

关于程序员类的技术书籍有很多,但是往往没有时间阅读,下面的这些书籍,是由John Sonmez(《软技能》作者)精选的架构经典书籍,可以帮助你提高技术技能,让你成为一名更好的程序员

大型项目前端架构浅谈

本篇文章不会更多侧重于具体技术实现,而是尝试从更高角度出发,分析为什么要这么做,这些设计能解决什么问题,成本和收益如何。前端架构的设计,应是用于解决已存在或者未来可能发生的技术问题

前端架构师对于框架的技术选型

前端技术发展日新月异,互联网上出现的新型框架也比较多,如何让新招聘的人员能够直接上手接替项目,或者有相关人员请假,替补人员的接替工作,如何做到不同前端工程师的开发的差异性更小

vue/react/angular开发的css架构思考

前端开发现在已经从传统的后端web多页面开发模式转向前端单页SPA开发模式,而vuejs/react/angular则是开发SPA非常优秀的前端框架。组件化开发由react最早提出,vuejs后发优势,将组件化开发贯彻到了极致

微服务架构 VS 单体架构

在软件行业,微服务架构是一种重要的发展趋势。这一趋势,不仅仅是对企业内的IT信息系统建设,甚至在企业向数字化转型方面,都有着深远的影响

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全