王朝网络
分享
 
 
 

关于MVC&Model2&Struts的一点看法

王朝vc·作者佚名  2008-05-31
宽屏版  字体: |||超大  

MVC

MVC是Model-View-Controller的简称,原本是建立Smalltalk 应用的框架。框架支持代表应用状态、屏幕表现和控制流的3个类,他们分别叫做Model、View和Controller。

在Model发生变化的时候,通知View改变;在View需要查询状态的时候,向Model发送请求,当View做出一个动作时,比如对数据的修改等,通知Controller;Controller得到状态改变信息时,发送请求给Model,并且Controller负责选择显示新的View。

下图是典型的Model-View-Controller范式,经常被表示为:一个互相连接的三角形。

图1 MVC 通常表示为3个互相连接的组件

在Design Patterns: Elements of Reusable Object-Oriented Software一书中,作者以smalltalk MVC为例,赞扬了通知/订阅者(notify/subscribe)协议和观察者(Observer)模式的使用。其中局的一个经典的例子是对同一数据,系统可能需要不同的显示视图,比如条形图、饼图、数据表格等等,如下图:

图2不同的View使用相同的Model

图2所示的每种视图可能在同一时间显示给不同的用户。应用必须保证在其下面的数据或者模型改变时视图的更新。为改变模型,用户提交一个请求给控制器,由控制起来配合改变模型。数据视图必须跟着改变,以反映最近的模型改变状态。

Smalltalk MVC 方案使用观察者通知模式。在这种模式下,每个视图注册为一个模型数据的观察者。然后模型可以通过发送消息给所有这册观察者,通知它们相关的改变。其为 Smalltalk MVC 框架已经通用化了,他也可以应用它其他平台上面。

Model2

Model2是Sun公司为了解决jsp不易维护和功能块难以复用提出的。Sun的技术人员,提出使用JSP 和 SERVLET同时来部署web 应用,SERVLET可以应付控制流,而 JSP则可专注于讨厌的编写Html的任务。

结合使用 JSP 和 SERVLET 开始被称为Model 2 ,而单独使用JSP称为Model 1。

Model2并不是什么新的东西,其思想上实际是对MVC的一种继续。很多场合,交互使用Model 2 和 MVC这两个词。但是还是存在一些争论,即一个应用是否是 MVC,以及是否支持经典的观察者通知模式。没有观察者通知的Model-View-Controller 有时被称为MVC2 或Web MVC。

层模式的MVC结构

人们认为Model2不同于MVC的主要原因之一是:基于观察者/通知模式的经典的MVC是难以在web环境下实现的。

因为HTTP协议是一个请求/响应协议,客户端有请求,服务器端才会有响应,没有请求,就没有响应。而观察者/通知模式要求在服务器端发生变化时能主动给用户端发消息更新。

为了解决经典MVC模式难于在web环境下实现的问题,引入层模式将状态改变和状态查询的职责加于控制器之上,并伴随着改变通知。

如图3,分层的web 应用使用一种比传统MVC模式更加“扁平”的模式。控制器被夹在表现层(View) 和 应用逻辑 (Model)之间。

图3web应用的层模式

每个组件的主要职责并没有改变。流程有稍微改变,View不再与Model有直接的联系,而它们之间的交互都通过Controller。即查询状态和改变通知都必须通过控制器;当视图,或者表现层需要加工动态页面时,它使用从控制器传递的数据而不是直接来自于模型层。这种改变去除了View 和 Model的耦合,答应控制器选择数据和显示这些数据的视图。

Struts概要介绍

Struts实现层模式的MVC

Struts是一个应用框架,它实现了层次化的MVC模式或者说Sun公司提出的Model2模式。

在Model1模式的web编程中,Model部分可以交给EJB及JDBC实现,而View部分可以由Jsp完成,但是却没有合适的工具完成独立的Contrroller。在Model2的思想提出由Servlet应付控制流,在Struts中Servlet就扮演了Front End Controller的角色。

当客户端提出请求,ActionServlet响应请求,并且在指定的Struts-Config.xml文件中查到请求对应的Action(Action是Struts引入的一个核心类,作为Back End Controller,在后文会介绍),对已经实例化的Action,ActionServlet为这个新的请求开一个线程,对未实例化的Action,ActionServlet将其实例化。

Action作为Back End Controller可以与Model部分交互,以实现状态改变或者状态查询,Action还将返回下一步的视图选择给ActionServlet。ActionServlet根据对应的Struts-Config.xml找到视图选择对应物理地址,并把新的View返回给用户端。

图4 Struts实现层模式的MVC结构

另一种常见的关于Srtuts实现MVC模式的看法是认为只有ActionServlet是Controller,而把Action看作BusinessLogic。我认为,这种看法是没有前一种将Action视为Back End Controller的看法合理的,因为Controller部分需要完成的视图选择实际上是由Action实现的。

之所以会有后一种不太合适的关于Struts实现MVC结构的看法存在,主要是起源于编程习惯问题,很多人喜欢把大量的业务逻辑交给Action处理,我认为这是不太合适的。一方面,这样降低了代码的可复用性;另一方面使Action看起来臃肿,降低了可读性。所以,推荐的编程方式是把大量的业务逻辑抽出做成javaBean,以解放Action。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有