`
txf2004
  • 浏览: 6877435 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Struts与MVC模式

阅读更多
在我前面的那篇<<再战MVC(二)>>最后也说到了:MVC本身就是一个非常复杂的系统,所以采用MVC实现Web应用时,如果采用现成的MVC框架,在此之下进行开发,能够达到事半功倍的效果。因为如果说要想在一些有限的时间里构造出来一个正确并且是可维护性的应用程序,我们必须有一个好的工具或者框架来建立表现层,纵观目前在开源社区中针对Web表现层的开源框架webwork,struts等,struts是一个不错的选择,因为Struts有完整的文档并且相对来讲比较简单。
MVC体系结构还有一些常用设计模式有了一定的认识之后,回过头来再次看那本Struts开发者写的<<struts in action>>,特别是发现第二章的“研究Struts体系结构”能让你看了对MVC模式以及Struts的体系结构有更深刻的理解,个人感觉这一章是整本书的精华的地方。
Model 1Model 2
控制层使应用层和视图去耦合
认为区别于MVC 的一个原因是,观察者/通知模式不能在web 环境内工作 Model 2 并不合适。HTTP 是一个 “拉” 的协议: 客户请求然后服务器响应。没有请求就没有相应。观察者模式需要一种“推”协议来进行通知,以便服务器能在模型改变时将信息推送到客户端。书上提到,虽然也有一些方法能模拟将数据推送到客户端,但这和基本情况相悖,并且会视为是权宜的修补。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lin_bei/struts%E5%9C%A8%E8%A1%8C%E5%8A%A82_page12_image1.jpg"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 359.25pt; HEIGHT: 328.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CGAOLIN~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C05%5Cclip_image001.emz"></imagedata></shape></span><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 359.25pt; HEIGHT: 328.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CGAOLIN~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C05%5Cclip_image001.emz"></imagedata></shape></span><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 359.25pt; HEIGHT: 328.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CGAOLIN~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C05%5Cclip_image001.emz"></imagedata></shape></span><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 359.25pt; HEIGHT: 328.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CGAOLIN~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C05%5Cclip_image001.emz"></imagedata></shape></span><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 359.25pt; HEIGHT: 328.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CGAOLIN~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C05%5Cclip_image001.emz"></imagedata></shape></span><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 359.25pt; HEIGHT: 328.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5CGAOLIN~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C05%5Cclip_image001.emz"></imagedata></shape>


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系统的底层支持,采用的主要技术是ServletJSPCustom 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数据库的连接。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics