Struts 2.x 与 struts 1.x 比较

来源:互联网 发布:数控编程指令代码 编辑:程序博客网 时间:2024/05/20 09:07
 

Struts 2.x 与 struts 1.x 比较

1).Action 类

Struts 1.x 要求Action 类要扩展自一个抽象基类,struts 1.x 的一个共有的问题是面向抽象类编程而不是面向接口编程。

       Struts 2.的Action类实现了一个Action 接口,连同其他接口一起来实现可选择和自定义的服务。Struts2 提供一个名叫ActionSupport 的基类来实现一般使用的接口。当然,Action接口不是必需的。任何使用execute 方法的POJO 对象可以被当作Struts2 的Action对象来使用。

2)线程模型

       Struts 1.x Action 类是单例类,因为只用一个实例来控制所有请求。单例类策略造成了一定的限制,并且给开发带来了额外的烦恼。Action 资源必须是线程安全或者线程同步的。       Struts2. Action 对象为每个请求都实例化对象,所以没有线程安全问题。(实践中Servlet容器给每一个请求产生许多丢弃的对象,并且不会导致性能和垃圾回收问题。)

3)Servlet 依赖

       Struts 1.x 的Action 类依赖于ServletAPI,当Action 被调用时,以 HttpServletRequest 和HttpServletResponse 作为参数传递给execute 方法。

       Struts 2 的Action 和容器无关。Servlet 上下文被表现为简单的Maps ,允许 Action 被独立地测试。Struts 2 的Action 可以访问最初的请求(如果需要的话)。但是,尽可能避免或排除其他元素直接访问HttpServletRequest 和HttpServletResponse。

4)易测性

       测试 Struts 1.x 的主要问题是 execute 方法暴露了ServletAPI ,这使得测试要依赖于容器。第三方的扩展,如 Struts TestCase ,提供了一套Struts 1 的模拟对象(来进行测试)。

       Struts 2 的Action 可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也使得测试变得简单。

5)捕获输入

       Struts 1.x 使用 ActionForm 对象来捕获输入。像 Action 一样。所有的ActionForm 必须扩展基类。因为 其他的javaBean 不能作为ActionForm 使用,开发者经常创建多余的类来捕获输入。DynaBeans 可以被用来作为替代ActionForm 的类来创建。但是,开发者可能是在重新描述已经存在的JavaBean (仍然会导致有冗余的JavaBean)。

       Struts 2 直接使用Action 属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能有自己的(子)属性的Rich对象类型。Action属性能够通过Web页面上的taglibs 访问。这种ModelDriven 特性简化了taglib 对POJO输入对象的引用。

6)表达式语言

       Struts 1.x 整合JSTL,所以它使用 JSTL 的表达式语言。表达式语言有基本的图形对象移动,但是对集合和索引属性的支持很弱。

       Struts 2 使用JSTL ,但是也支持一个更强大和灵活的表达式语言——OGNL(Object-Graph Navigation Language)。

7)将值绑定到页面

       Struts 1.x 使用标准JSP机制将对象 绑定到页面上下文。

       Struts 2 使用“ValueStack”技术,使taglib 能够访问值而不需要把页面(View)和对象绑定到一起。ValueStack 策略允许通过一系列名称相同相同但类型不同的属性重用页面(View).

8)类型转换

       Struts 1.x 的ActionForm 属性经常都是String 的。Struts 1.x 使用Commons-Beanutils 来进行类型转换。转换每一个类,而不是为每一个实例配置。

       Struts 2 使用OGNL 进行类型转换。提供基本和常用对象的转换器。

9)验证

       Struts 1.x 支持在ActionForm 的validate 方法中手动校验,或者通过Commons Validator 的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

       Struts 2 支持通过validate 方法和XWork 校验框架来进行校验。XWork 校验框架使用为属性类类型定义的校验和内容校验,来支持chain 校验子属性。

 

10)Action 执行控制

       Struts 1.x 支持每一个模块有单独的Request Processors (生命周期),但是模块中的所有Action必须共享相同的生命周期。

       Struts 2 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action 创建不同的生命周期。堆栈能够根据需要和不同的Action 一起使用。

 

原创粉丝点击