struts 2.0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts
2.0: 引领
下一代Web
开发趋势
(计算机世界报 2007年10月29日第41期
2007-10-25 21:19:13 B23-B24)
Struts自推出以来不断受到开发者的追捧,其最新版本Struts 2.0亦代表了下一代Java Web开发的新趋势。
Struts 2.0框架具有一系列丰富的特性,对大
型开发社区很有帮助,而且,从Struts 1迁移到Struts 2也不是很困难。
Apache Struts(简称Struts)是一种非常流行的Web框架,可用于使用Java企业版(JEE)开发Web应用。
Struts项目是负责开发及维护Struts框架
的开源社区。
Struts在2001年7月发布,目前已成为使用JEE开发Web应用
的事实上的标准。
而社区新近发布的Struts 2.0更是一种精致、可扩展的框架,
可用于使用Java代码来开发企业就绪的Web应用。
该框架旨在简化从构建、部
署到日常维护的整个应用开发周期。
设计Struts框架的目的是为了让开发人员可以构建一种数据库代码、页面设计代码和控制流程代码不混合在一起的服务器小程序或者JavaServer Pages。
因为,要是代码混合在一起,随着应用越来越庞大,就会变得难以维护。
Struts
框架基于MVC架构,可以帮助开发人员利用明确的关注点分离(separation of
concerns)原则,开发动态Web应用。
Struts框架提供了自己的Web控制器组件来处理控制流程逻辑。
至于视图,它集成了其他技术,譬如JavaServer Pages(包括JSTL和JSF)、Velocity
模板引擎和XSLT。
至于模型,它使用JDBC、EJB、Hibernate或者iBATIS
等技术来访问数据。
Struts 1.0非常成熟,因此得到众多开发社区的有力支持,而且说明文档内容完备。
不过在过去的几年里,许多开源社区的Web框架纷纷登台亮相,所以它
需要跟上Web应用需求不断变化的形势,这就有必要构建下一代Struts框架。
力求满足这个要求的初始提案是Struts Ti,这种简化的MVC Model 2框架可用
于让需要更少配置、更好结构和控制器特性的人开发Web应用。
人们考虑用来实
现这个目的的另一个框架是Apache Shale,不过,Shale是基于组件的一种框
架,它立足于JSF。
Shale开发社区不愿与Struts联合,决定继续把Shale作
为一个顶级项目来开发。
WebWork项目由Open Symphony社区启动,面向Struts开发社区。
它旨在满足那些希望寻求类似Struts的一种框架,但有更好特性的人的需要。
WebWork框架于2002年发布。
独立运作了几年后,WebWork和Struts两
个社区在2005年12月联合起来,开发了新版本的Struts,即Struts 2。
Struts
2实际上就是Struts 1与WebWork的结合体。
Struts的这个新版本更易使用,
更接近Struts框架的最初版本。
基于MVC架构的Struts 2
如前所述,Struts框架基于MVC架构。
Struts 2具有一种灵活的控制层,基于Java过滤器、JavaBean、ResourceBundle、Locale和XML等诸多标
准技术上,还基于OGNL和XWork等各种Open Symphony包。
至于模型,该框架可与JDBC、EJB及其他框架(包括Hibernate、iBATIS 和Cayenne)等标准的数据访问技术相互联系。
至于视图,该框架可以使用
JavaServer Pages(包括JSTL和JSF)、Velocity模板、PDF、XSLT和
FreeMarker。
除了支持Action和结果外,Struts框架还提供对异常处理程序和拦截器的支持。
异常处理程序声明用于定义全局异常和本地异常的异常处理程序。
不需要
在代码中编写try/catch块,这个框架其实简化了异常处理。
框架捕获每个异常
后,会显示消息和异常方面相应细节的页面。
拦截器指定了动作的请求处理生命周期。
拦截器还指定了在Action类执行前后出现的动作顺序。
如前所述,拦截器经配置后,可以把常见功能作用到请求上。
该框架的大多数核心功能作为拦截器来实现。
如果有些动作响应了Ajax、SOAP
或者JSF请求,生命周期就能得到简化,请求也只需通过拦截器传送,不需要任
何执行。
Struts 2请求处理流程
这个架构实际上又是如何工作的呢?初始请求先发送到服务器小程序容器(譬如Tomcat),然后通过一系列过滤器传送。
如果与Site Mesh插件等其他技术集成,可选的ActionContextCleanUp过滤器就很有用,要是用到这个过滤器,请求先通过它传送。
接着,调用请求的FilterDispatcher,它使用ActionMapper来确定要不要为这个请求调用动作。
如果ActionMapper确定应当调用Action,FilterDispatcher就把控制权委托给ActionProxy。
ActionProxy使用了框架配置文件管理器,该管理器通过struts.xml文件来初始化。
然后,ActionProxy 创建ActionInvocation,它负责实现命令模式。
ActionInvocation进程调用所需的拦截器,然后调用Action。
一旦该Action执行,ActionInvocation就负责查寻与struts.xml中映射的Action结果代码相关的合理结果。
然后结果被执行,大多数时候,这会显示用FreeMarker或者Velocity编写的JSP或者模板。
按照相反顺序完成Action之后,拦截器再次得到执行。
最后,响应通过web.xml中配置的过滤器返回。
如果ActionContextCleanUp过滤器经过配置,FilterDispatcher就不会清理ThreadLocal ActionContext (ActionContext拥有运行时请求和响应的全部细节,该框架使用ThreadLocal以及ActionContext类来
提供配置及其他运行时细节)。
如果ActionContextCleanUp过滤器未经配置,FilterDispatcher就会清理所有的当前ThreadLocal。
图1描述了Struts 2框架的架构。
这一切似乎都有点抽象。
为了帮读者有更深入的了解,下面提供一个典型的架构请求流程,图2显示了这个顺序。
1.用户请求对Web应用执行某个动作后,Web浏览器将要求某些资源的请求发送到Web服务器。
2.服务器小程序过滤器调度程序接到请求后,分析请求,然后确定调用相应的动作,提供资源。
3.在Action被执行之前,经配置后把一些常见功能(如验证、工作流或者文件上传)作用到请求上的一组拦截器上,可自动作用到该请求上。
4.Action类的一个新实例被创建,然后执行动作方法,用于把信息存储到数据库,或从数据库获取信息。
5.结果显示输出——无论输出的是HTML、图像、PDF还是其他某种格式。
6.然后,请求按照相反顺序通过拦截器传送。
返回的请求允许执行其他的处理或者清理操作。
7.最后,容器把输出发送到浏览器。
Struts 1与Struts 2的比较
Struts 1和Struts 2有三个共同的基本概念: 请求处理程序、响应处理程序和标签库。
不过在Struts 2中,这些部分经过了重新设计,并得到了改进,以便开发。
开发人员会注意到Struts 2框架中出现的许多改动。
譬如说,过滤器取代了服务器小程序,相应变化在部署描述文件里会有所体现。
同样,配置文件经过了全面改动。
还会注意到其他一些关键特性,譬如Action
类方面的变化、支持注释、验证方面的变化。
表1详细解释了这些变化。
Struts 2.0的新特性
Struts 2.0框架中出现的许多特性旨在让Struts更容易使用:
●改进的设计: 与Struts 1相比,Struts 2的所有类都基于接口,核心接口独立于HTTP。
这些API 并不依赖服务器小程序API。
●简化的Action: Struts 2 Action类独立于框架,是简化的普通Java对象(POJO)。
拥有execute()方法的任何Java类都可以用做Action类。
● POJO表单: Struts 2不支持ActionForms特性。
ActionForms中定义的属性可以直接放在Action 类上。
不需要使用所有的String属性。
●智能默认值: Struts 2配置文件中的大多数配置元素都会有默认值,所以不需要设定值,除非需要不同的值。
这有助于减少在XML文件中需要进行的配置。
Struts 2支持注释,这带来了更大的方便。
●改进的结果: 在Struts 2中,
>forward<标签被<result>标签取代。
不像 ActionForwards,Struts 2结果可以帮助准备响应,并提供构建多种输出类型的灵活性。
●改进的标签: Struts 2标签不单单发送输出数据,还能提供样式表驱动标记,这样就可以用较少的代码构建一致性页面。
Struts 2标签现在可与FreeMarker、Velocity及类似模板引擎配合使用。
●引入拦截器: Struts 2为拦截器(interceptor)提供了全面支持。
拦截器可在Action类执行前后加以执行。
拦截器经配置后,可以把工作流程或者验证等常见功能作用到请求上。
所有请求通过一组拦截器传送,之后再发送到Action类。
Action类被执行后,请求按照相反顺序再次通过拦截器传送。
●支持Ajax: 为了创建使用Ajax的动态Web应用,Struts 2提供了Ajax主题,从而大大改进了交互应用。
面向Ajax的Struts 2标签基于Dojo窗口组件。
还有用于其他框架的插件。
●快速启动: 部署配置文件可以重新装入; 因而,可以动态地进行许多变化,用不着重新启动Web
容器。
●状态复选框: Struts 2框架可自动跟踪复选框,如果缺少了某复选框,就会采用默认值false。
因而,不像在Struts 1中,复选框不需要对false值进行特殊处理。
●易于测试: Struts 2 Actions独立于HTTP,因而与框架中立。
无须使用模拟对象(mock object),就很容易测试。
●使用注释: 使用Struts 2开发的应用可以使用Java 5注释,作为XML和Java属性配置之外的一个替代办法。
注释尽量减少了对XML的需要。
Action、拦截器、验证及类型转换方面都有注释。
●易于插入: 只要把插件JAR文件放到\WEB-INF\lib目录中,即可轻松安装Struts 2插件,不需要手动配置。
●便于与Spring集成: Struts 2 Action能够感知Spring(Spring-aware)。
只要为某个应用添加Spring beans,就可以添加对Spring的支持。
●易于定制的控制器: Struts 1允许请求处理程序可按照模块来定制,在Struts 2中,需要的话,可以按照动作来定制请求处理。