分享
 
 
 

Struts与MVC模式

王朝vc·作者佚名  2007-09-21
窄屏简体版  字體: |||超大  

在我前面的那篇<<再战MVC(二)>>最后也说到了:MVC本身就是一个非常复杂的系统,所以采用MVC实现Web应用时,如果采用现成的MVC框架,在此之下进行开发,能够达到事半功倍的效果。因为如果说要想在一些有限的时间里构造出来一个正确并且是可维护性的应用程序,我们必须有一个好的工具或者框架来建立表现层, 纵观目前在开源社区中针对Web表现层的开源框架webwork,struts等,struts是一个不错的选择,因为Struts有完整的文档并且相对来讲比较简单。

对MVC体系结构还有一些常用设计模式有了一定的认识之后,回过头来再次看那本Struts开发者写的<<struts in action>>,特别是发现第二章的“研究Struts体系结构”能让你看了对MVC模式以及Struts的体系结构有更深刻的理解,个人感觉这一章是整本书的精华的地方。

Model 1跟Model 2

有关Model 1跟Model 2的介绍在之前的<<再战MVC>>的两篇文章中已经介绍了,总的来说就是Servlet可以应付控制流,而 JSP则可专注于编写HTML的任务。

控制层使应用层和视图去耦合

认为区别于MVC 的一个原因是,观察者/通知模式不能在web 环境内工作 Model 2 并不合适。HTTP 是一个 “拉” 的协议: 客户请求然后服务器响应。没有请求就没有相应。观察者模式需要一种“推”协议来进行通知,以便服务器能在模型改变时将信息推送到客户端。书上提到,虽然也有一些方法能模拟将数据推送到客户端,但这和基本情况相悖,并且会视为是权宜的修补。

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

上图是典型的MVC模式,经常被表示为:一个互相连接的三角形。对于一个基于Web的应用程序而言,是很难维护该三角形的“改变通知(state query/change notification)”这一部分。 这些东西在所有资源都在一台服务器上,而且客户端保持一个开放连接的情况下工作得非常好。如果资源分布在不同的服务器上,并且客户端不能维护一个开放的连接情况下,工作的并不理想。 许多分布式系统架构,包括web应用,在视图进行状态查询的概念时退缩了。针对这种不同,绝大多数情况是入分层的概念来设计的,层内的对象可以和同一层或者相邻层的对象进行通信。在一个复杂应用中,这可以在添加组件时,防止依赖关系呈指数增长。对于分布式应用程序而言,“分层“模式是设计中的核心模式。

正如上图上所示,使用平面设计而不是传统的MVC设计方式。控制层处于表现层(视图)和应用程序逻辑(模式)之间。

从MVC 上下文中,引入层模式将状态改变和状态查询的职责加于控制器之上,并伴随 着改变通知。

每一个模块的主要职责并没有改变。流程有轻微改变,即查询状态和改变通知都

必须通过控制器。另一个改变是当视图(表现层)生成动态内容时,它使用由控制器提供的数据而不是直接由模式提供的数据。所以说这样的改变使得视图更加和模式无关了,即由控制器来选择数据并显示数据的视图,这样就从根本上去除了View 和 Model的耦合。

Struts框架与Servlet

我们知道Sun的Java Servlet作为一个基本的平台来为基于Java的Web应用程序提供了很多重要的功能。从Servlet API我们可以发现,Servlet提供了一个基本的接口来处理HTTP的请求和响应,而且我们可以用Session的上下文或其它的上下文(如请求上下文request)来作为跟踪应用程序的用户的重要的手段。其实大部分表现层框架都有一个共性的地方:以Servlet API为基础,封装一些那些经常要处理的而且是令人厌烦的、繁琐的实现细节,比如说:在一个Web应用中,表单数据的接收是一件经常要做的事,因为有大量的来自客户端用户提交的表单,然后针对这些表单,我们总是要详细分析Http请求来取出页面表单的值来。Struts是一个比较好的MVC体系结构的框架,提供了对开发MVC系统的底层支持,采用的主要技术是Servlet,JSP和Custom tag library。

Struts框架的组件结构图

从上面的组件结构图我们可以看出来,Struts的核心ActionServlet是一个MVC风格的控制器,它是连接应用程序的Model和View之间的一座桥梁。

Struts跟Model 2, MVC, 层

层模式,在<<UML和模式应用>>第3版(Applying UML and Patterns)这本书讲到逻辑架构时说到了有关层模式的概念,其中有一个准则叫做:模型-视图分离原则。这个原则规定模型(领域)对象不应该直接与视图(UI)对象连接。Struts 通过提供一个控制器ActionServlet实现了Sun的 Model 2 架构,这个控制器可以用来管理JSP页面和ActionMapping来保证表现层之外的控制流决策来实现MVC/层模式,通过Struts的配置文件,JSP可以引用一个逻辑目标。控制器组件在运行时提供准确的URI。 供一个控制器Servlet实现了Sun的 Model 2 架构,其他表现设备之间的流程。Struts 通过使用ActionForward MVC/层 模式。

下表列出了Struts的核心类,即对应的经典的MVC组件职责。

核心Struts 类和MVC的对应

除了这些核心类,Struts使用一些配置文件和视图助手(view helpers)来沟通控制器和模型。下表列出了Struts 配置文件和描述了他们在架构中的角色。为将Struts配置数据暴露给视图,框架以JSP标签的形式提供了大量的助手类,这些都是struts自定义标签,如下表:

Strtuts配置文件

将以上内容放在一起,下表按层列出了Struts 组件:

Struts 组件,按层索引

在<<UML和模式应用>>这本书里提到了层模式中的组件应该只能和相同层和相邻层的组件交互。因此,Model 组件不能直接和View组件进行交互。我们还可以从上表中看出来,Struts中的大部分的组件其实是属于控制层的组件,因为Struts没有对模型层有严格的规定,我们可以用EJB或者其它的开源框架等。

实践中,控制器与视图的交互通过请求(request),会话(session)以及Servlet平台提供的应用上下文进行(context)。 控制器和模型的交互通过文件和存储系统完成 (比如装入sturts的XML配置文档或者属性文件),或者通过其他服务,如TCP, 创建一个到JDBC数据库的连接。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有