(1)运行在客户机上的客户层组件;
(2)运行在Java EE服务器上的Web层组件;
(3)运行在Java EE服务器上的业务逻辑层组件;
(4)运行在企业信息系统服务器上的企业信息系统层组件[2]。
2。2 Struts2概述
2。2。1 MVC简介
MVC是一种非常经典的设计模式,它将软件系统分为Model、View和Controller这三个核心部件,这三个部分以最小的耦合协同工作,以增加程序的可扩展性和可维护性。View层代表用户交互界面,MVC设计模式对于视图的处理仅限于对视图中的数据的采集和处理。Model层处理业务流程以及制定业务规则,它接受视图请求的数据,并返回最终的处理结果。Controller层从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求[3]。各个部分的实现技术可以总结如下:
Model:JavaBean、EJB的EntityBean
View:JSP、Struts的TagLib
Controller:Struts的ActionServlet、Action
2。2。2 Struts2简介
Struts2是在Struts1框架的基础上融合了WebWork优秀框架升级得到的[4]。
Struts1的缺点:
(1)struts框架基于servlet进行开发的,所以servlet的问题在这个框架中都能体现出来;
(2)struts框架的流程是固定的,想要扩展业务流程非常的不方便;
(3)只支持动态视图JSP展现数据,对于现在的SEO(搜索引擎优化)支持不好[5]。
Struts2框架改善的地方:
(1)核心基于Filter;
(2)流程可以动态扩展;
(3)多例创建对象;
(4)支持多种视图展现技术(JSP,Freemarker,Volicity)[6]。
2。2。3 Struts2与Struts1对比
(1)在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接 口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action[7]。 文献综述
(2)线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题[8]。
(3)Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2 Action不再依赖于Servlet API,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择[9]。
(4)可测性方面的对比:测试Struts 1 Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器。为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts 1的Action类。Struts 2 Action可以通过初始化、设置属性、调用方法来测试[10]。
(5)封装请求参数的对比:Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数。虽然Struts 1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich对象类型。如果开发者依然怀念Struts 1 ActionForm 的模式,Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO,从而降低了代码污染[11]。