2.1 Struts 2框架的发展
2.1.1 MVC模式的应用
MVC是一个设计模式,它强制性地使应用程序的输入、处理和输出分开。使用MVC模式,应用程序被分成三个核心部件:模型(Model,即M)、视图(View,即V)、控制器(Controller,即C)。它们各自处理自己的任务。
视图:视图是用户与之交互的界面,在现阶段的应用中,特别是Java EE的应用中,HTML及JSP的应用是最广泛的,当然还有一些页面技术,如Macromedia Flash、XHTML、XML等。视图最大的作用就是输出数据并允许用户操作,它不关心数据的处理及操作的处理等工作,这些处理操作都交由控制器来完成。
模型:在这三个部件中,模型拥有最多的处理任务。简单地说,模型部分就是对数据库的操作。它处理的数据是中立的,模型一般被控制器调用。由于模型的代码只写一次就可以被多个视图重用,所以减少了代码的重复性。
控制器:控制器主要接收用户的输入并调用模型和视图来完成用户的需求。它本身不输出任何东西做任何处理。它只接收请求并决定调用哪个模型来处理请求,然后确定用哪个视图来显示模型处理返回的数据。
从这三个部件的各自作用中可以总结出MVC模式的处理过程:首先控制器接收用户请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
MVC的优点大致有以下几点。
(1)低耦合性。视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码。同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
(2)高重用性和可适用性。随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何WEB(HTTP)浏览器或者无线浏览器(WAP)。比如,用户可以通过电脑也可通过手机来订购某种产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的仅是改变视图层的实现方式,控制层和模型层无须做任何改变。
(3)较低的生命周期成本。MVC使降低开发和维护用户接口的技术含量成为可能。
(4)快速的部署。使用MVC模式使开发时间得到相当大的缩减,它使程序员集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
(5)可维护性。分开视图层和业务逻辑层也使得Web应用更易于维护和修改。
(6)有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。
由此可见,MVC模式是一个优秀的创建软件的途径,尤其在Java Web应用程序的架构方面。采用MVC的Java Web应用程序在健壮性、代码重用性和结构方面将更上一个新台阶。
2.1.2 Struts框架应用
一般情况下所说的Struts框架指的是Struts 1框架,而非Struts 2框架。Struts框架是最早出现的MVC框架,能够很好地帮助Java开发者利用Java EE开发Web项目。Struts框架的工作流程图如图2.1所示。
图2.1 Struts框架的工作流程图
从上图可以知道Struts的工作流程如下所述。
(1)客户端发出请求,ActionForm封装数据,然后提交给ActionServlet。
(2)ActionServlet根据请求信息找到指定的Action,并将请求转发给Action。
(3)Action调用JavaBean(即视图)提供的业务逻辑方法处理请求,并返回ActionForward。
(4)ActionServlet根据ActionForward信息将请求转发给JSP页面。
(5)将最终页面返回给客户端。
可以看出,应用Struts框架符合MVC编程思想,条理也很清晰。尽管如此,Struts框架的设计还存在很多问题。了解Struts的读者可以知道,Struts的Action与Servlet API紧密地结合在一起,这使程序的耦合度大大增加,从而给软件的测试带来很大的难度,同时也大大降低了代码的可扩展性。另一个框架WebWork的出现,很好地解决了Struts框架中的问题。
2.1.3 WebWork框架应用
WebWork也是一个优秀的基于MVC模式的框架。其优于Struts框架的最突出的特点是:在WebWork的开发过程中,代码已经不再依赖Servlet API了。WebWork框架的工作流程图如图2.2所示。
图2.2 WebWork框架的工作流程图
从上图可以得出WebWork的工作流程如下所述。
(1)ServletDispatcher接收客户端请求。
(2)ServletDispatcher根据请求找到指定Action,并调用该Action处理请求信息。
(3)Action处理完成后返回一个结果映射,该映射指定具体视图信息。
(4)由视图信息找到对应的JSP页面,并显示给客户端。
虽然WebWork框架很优秀,但是由于种种原因,WebWork并没有像Struts那样被广泛应用。
2.1.4 Struts 2框架的诞生
由于Struts 1设计上的缺陷,使得它渐渐无法满足程序员要求高效、灵活的开发需求,于是很多程序员开始选择其他优秀的开发框架,Struts 1的开发团队也意识到了这一点,开始考虑Struts 1的后续发展,寻找另一个合作伙伴——WebWork。
WebWork 1.0是在2002年3月发布的,它是Rickard Oberg在研究了其他的Java Web开发框架之后创建出来的,引入了很多新的思想、概念和功能。熟悉Struts 1的读者应该知道,在Struts1中,ActionForm是个让程序员头痛的问题,而WebWork解决了ActionForm的问题,同时在WebWork中,可以使用普通的JavaBean对象,甚至Action本身来接收表单提交的数据。不仅如此,WebWork中的Action没有和Servlet API耦合在一起,大大提高了程序的松耦合性。
虽然WebWork设计思想先进,功能强大,但由于种种原因,市场占有率并不高,Struts 1的高市场占有率加上WebWork的精湛技术,使得两项技术的领头人走向合作,推出一个崭新的框架——Struts 2。
2006年,WebWork与Struts这两个优秀的Java Web框架(Web Framework)的开发团队,整合了WebWork与Struts的优点,推出了一个非常优秀的崭新的框架,就是Struts 2,而以前的Struts就称为Struts 1。
Struts 2是在WebWork 2的基础上进行开发的,Struts 2.0其实就是WebWork 2.3,它和Struts 1并没有很大的关系,如果读者使用过WebWork框架,那么学习Struts 2就能很快上手;相反,了解Struts 1的读者学习Struts 2,面对的将是一个全新的框架。本书会由浅入深地详细介绍该框架,目的就是让即使不懂前面两个框架的读者也可以很好地掌握该框架,并能够熟练地实际应用。