MVC简介

MVC简介

面试的时候被问到关于MVC相关的知识,才发现自己只会说出来什么叫MVC,但是其详细的东西自己却无法顺利的表述出来,特在此记录下。

MVC基础

MVC是Model-View-Controller的简称,是一种软件架构模式,也是经过很多人的长期实践最后得出来的很适合软件开发的一种模式。

M(Model)模型层,这应该是最底层的一层,这一层中我们需要处理的是业务逻辑和数据等等方面的东西,包括核心业务代码的编写,访问数据库或者文件进行数据处理,数据库等很多方面。

V(View)视图层,这一层是最上面的一层,用户可以看到并且进行操作的地方。

C(Controller)控制层,这部分处于中间,负责转发和处理请求,接收来自视图层用户的操作等,负责处理和转发;会根据情况传递到模型层,模型层做完处理之后,再由控制层根据实际情况返回到视图层去展示。另外一种情况是在模型层处理完之后,可以直接将结果返回给视图层。

Web MVC

Web开发中的MVC模式跟标准的MVC模式一样,但是Web MVC不能在模型层将结果主动推送给视图层,因为Web模式下是基于请求-响应模型的。其他的定义和流程都和标准MVC模式是一样的。

Web如何进化到MVC

这里的Web进化主要利用Java开发方面的历程作说明,当然最开始的CGI不算是Java中的过程,但是还是需要它作为开头。

大致的历程为:CGI --> Servlet --> JSP --> Model1 --> Model2

CGI

由于没有使用过CGI这种技术做过开发,只能使用维基上的定义来简单说明下。CGI是通用网关接口(Common Gateway Interface)的简称,多使用Perl语言编写,接受用户的请求,然后根据请求的返回给用户HTML页面。但是每次CGI请求都会生成一个新的进程去处理,对服务器来说压力太大,请求大的时候很快就会垮掉。

Servlet

Servlet技术和CGI技术的作用是一样的,但是Servlet是Java体系中最早用来解决Web的技术。Java是平台无关的,同样Servlet也是,它比CGI更加的高高效,CGI针对请求生成的是进程级别的,而Servlet生成的是线程级别的。

Servlet的生命周期

  1. 加载和实例化

    Servlet容器负责加载和实例化Servlet。

  2. 初始化

    Servlet在实例化之后,会调用init()方法初始化。

  3. 服务

    Servlet的service()方法对请求进行处理。

  4. 销毁

    Servlet的destory()方法用来销毁Servlet实例,释放资源等。

Servlet缺点

Servlet技术让Java有了Web方面的更好的选择,后来的技术很大一部分都是在Servlet的基础上发展来的。但是Servlet直接做开发还是显得很繁琐,我在使用Servlet做开发的时候遇到过很多的弊端,直接点说就是Servlet做开发时,把MVC的分层直接放到一起了,甚至html代码也得在Servlet里面直接输出。这样的做法对于后期维护修改或者页面的调试很是麻烦。现在直接用Servlet做开发已经很少用了,但是还是得作为必须要去学习的基础知识。

JSP

JSP技术使用在html页面中嵌入脚本语言的方式来处理Servlet技术的不足,相对于Servlet来说有了很多进步,开发页面更加方便简单。但是实质上JSP最后还是被编译成了Servlet,表现逻辑以及控制和模型等方面的逻辑还是混杂在了一起,看起来好像是跟Servlet反过来一样。这种做法同样不可取。

Model1

这种技术是JSP和JavaBean的组合,相对于JSP来说只是将业务逻辑放到了单独的JavaBean中去,可以理解为是JSP的增强,对JSP页面进行了简化,但是JSP页面仍然将表现逻辑,控制逻辑,业务逻辑等混杂到一起。这种做法仍然不可取。

Model2

Model2采用JSP+Servlet+JavaBean来实现,其实这时候就可以认为是我们的Web MVC模型了,在实际使用中也是使用的这种模式。

JSP 使用html和jsp的标签来负责实现表现层;Servlet负责接收用户的请求,转交给模型层进行处理,返回结果给视图层等功能;JavaBean负责业务逻辑的处理,也就是模型层的功能。

到这里为止,开发过程中遇到的方式都已经介绍完了,也走到了MVC模式这一步。下面会简单介绍下MVC的框架相关知识。

Spring Web MVC

先看一下Spring官方的一张请求处理流程图:



再看一下具体的流程:

  1. 第一步,用户发送请求(Incoming request)到前端控制器(Front controller)
  2. 前端控制器(Front controller)根据实际的请求信息来决定把请求委托给具体的页面控制器(Controller)。页面控制器用来处理实际的请求内容,直接返回或者需要Model层进行数据处理。
  3. 页面控制器(Controller)接收到请求后进行处理,处理完成后返回model数据,并委托给前端控制器(Front controller)进行渲染。
  4. 前端控制器(Front controller)根据逻辑视图名和model数据选择视图模板(View template)进行渲染,渲染完成后返回给前端控制器(Front controller)。
  5. 最后前端控制器将渲染后的最终结果返回给用户。

对应具体的源码分析不在此做过多说明。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容