技术开发 频道

Spring 2.0集成Struts 2.0

【IT168 技术文档】引言

Struts 2在经历了两年漫长的开发后,终于在2007年2月底正式发布,Struts 1.3.8是Struts 1的最终版本,Struts 1从此不再升级。Struts 2和Struts 1差别非常大,几乎是两个完全不同的东西,所以不要指望Struts 1在不经过修改的情况下就可以跑在Struts 2环境下。Struts 2与其说是Struts的升级版本,莫如说是WebWork的升级版本——我们可以通过WebWork开发团队当年宣称并入Struts时所提到的一句话了解到这一点:“WebWork 拥有前卫的技术,Struts 拥有强大的用户群,两者的合并或许将是一个完美的组合……”。

Struts 2概述

众所周知,Struts 2是Struts和WebWork的混血儿, 而在Webwork 2.2之前的Webwork版本,其自身有一套IoC实现,在Spring 框架如火如荼发展的背景下,Webwork决定放弃控制反转功能的开发,转由使用Spring的实现。有越来越多的开源组件(如iBATIS等)都放弃与Spring重叠功能的开发,因此,Struts 2推荐大家通过Spring实现IoC功能。
Struts 2 拥有众多的新特性,下面我们对此进行概括性的描述:

 ·Action类更加灵活

Struts 2的Action类可以实现一个Action接口,也可实现其他接口,因此很容易添加定制性的服务。Struts 2提供一个ActionSupport,它是实现了Struts常用接口的方便类。Action接口不是必需的,任何具有execute签名的POJO都可以用作Struts 2的Action对象。

 ·每一请求对应一个Action实例

Struts 1的Action以单例模式运行,所有的请求对应同一个Action实例。因此用户必须保证Action本身是线程安全的。Struts 2 的Action对象为每一个请求产生一个实例,因此没有线程安全问题,它相当于Spring MVC的ThrowawayController。

 ·不依赖于Servlet 容器

Struts 1 Action 依赖于Servlet 容器,但Struts 2 Action不依赖于Servlet容器,允许Action脱离容器单独测试。如果需要,Struts2的Action仍然可以访问到request和response实例。

 ·具有很强的可测试性

由于Struts 1依赖于Servlet容器,所以很难脱离容器进行测试,虽然可以通过StrutsTestCase使用模拟对象进行测试,但操作依旧比较麻烦。Struts 2的Action不依赖于Servlet容器,用户可以简单地通过初始化、设置属性、调用方法进行测试,同时“依赖注入”的支持也使测试更加容易。

 ·捕获输入更加灵活

Struts 1使用ActionForm对象捕获输入,所有的ActionForm必须继承一个基类。Struts 2直接使用Action属性绑定请求参数,消除了对第二个输入对象的需求。这种模型驱动的特性简化了页面标签对POJO输入对象的引用。

 ·表达式语言更强大

Struts1整合了JSTL,因此可以使用JSTL EL。这种EL有基本对象图遍历的功能,但是对集合和索引属性的支持很弱。Struts2依旧可以使用JSTL,但是也支持一个更强大和灵活的对象属性引用语言——“Object Graph Notation Language(OGNL)”。

 ·实现值和页面的灵活绑定

Struts 1使用标准JSP机制把对象绑定到页面中进行访问。Struts 2使用“值堆栈”技术,使标签能够访问值而不需要把页面和对象绑定起来。“值堆栈”策略允许通过一系列名称相同但类型不同的属性重用页面。

 ·类型转换更加方便

Struts 1 的ActionForm属性通常都是String类型,Struts1使用Commons-Beanutils进行类型转换。每个类对应一个转换器,对每一个实例来说是不可配置的。Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。

 ·数据校验更加方便

Struts 1支持在ActionForm的validate()方法中进行校验,或者通过Commons Validator的扩展进行校验。同一个类可以有不同的校验内容,但不能校验子对象。Struts2支持通过validate()方法和XWork校验框架来进行校验。

 ·Action的生命周期更加灵活

Struts1支持每一个模块有单独的生命周期,但是模块中的所有Action必须共享相同的生命周期。Struts 2支持通过拦截器堆栈为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

0
相关文章