Struts1.x与Struts2的比较

Action 类  
Struts1.x要求 Act

ion类要扩展自一个抽象基类。 Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。 
Struts2的Action类实现了一个Action 接口,连同其他接口一起来实现可选择和自定义的服务。Struts2提供一个名叫ActionSupport 的基类来实现一般使用的接口。 当然, Action接口不是必须的。 任何使用execute方法的POJO对象可以被当作Struts 2的Action对象来使用。 
 
线程模型  
Struts1.x Action类是单例类,因为只有一个实 例来控制所有的请求。单例类策略造成了一定的限制,并且给开发带来了额外的烦恼。Action资源必须是线程安全或者同步的。 
Struts2 Action对象为每一个请求都实例化对象,所以没有线程安全的问题。 (实践中,servlet容器给每一个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题) 。 
 
Servlet 依赖 
Struts1.x 的 Action 类依赖于 Servlet API ,当 Action 被调用时,以 HttpServletRequest 和HttpServletResponse作为参数传给execute方法。 
Struts2 的 Action 和容器无关。Servlet 上下文被表现为简单的 Maps,允许 Action 被独立的测试。Struts2的 Action 可以访问最初的请求(如果需要的话)。但是,尽可能避免或排除其他元素直接访问HttpServletRequest 或HttpServletResponse。 
 
易测性 
测试Struts1.x的主 要问题是execute方法暴露了Servlet API这使得测试要依赖于容器) 。第三方的扩展,如Struts TestCase,提供了一套Struts1的模拟对象(来进行测试) 。 
Struts2的Action可以通过初始化、设置属 性、调用方法来测试。依赖注入的支持也是测试变得更简单。
 
捕获输入 
Struts1.x 使用 ActionForm对象来捕获输入。象Action一样,所有的ActionForm必须扩展基类。因为其他的JavaBean 不能作为 ActionForm 使用,开发者经常创建多余的类来捕获输入。DynaBeans 可以被用来作为替代 ActionForm 的类来创建。但是,开发者可能是在重新描述(创建)已经存在的 JavaBean(仍然会导致有冗余的javabean) 。 
Struts2 直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action 属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm 模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglib 对POJO输入对象的引用。 
 
表达式语言  
Struts1.x整合 JSTL,所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动,但是对集合和索引属性的支持很弱。 
Struts2 使用 JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL)。 
 
将值绑定到页面 
Struts1.x使用标准JSP机制来绑定对象到页面上下文。 
Struts2 使用“ValueStack”技术,使 taglib 能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view) 。 
 
类型转换  
Struts1.x的ActionForm属性经常都是String。 Struts 1.x使用Commons-Beanutils来进行类型转换。转换每一个类,而不是为每一个实例配置。 
Struts2使用 OGNL进行类型转换。提供基本和常用对象的转换器。 
 
验证  
Struts1.x支 持在 ActionForm 的 validate 方法中手动校验,或者通过 Commons Validator 的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。 
Struts2 支持通过 validate 方法和 XWork 校验框架来进行校验。XWork 校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性 
 
Action 执行控制  
Struts1.x支持每一个模块有单独的Request Processors(生命周期) ,但是模块中的所有Action必须共享相同的生命周期。 
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。  
转于:http://aayy520.blog.163.com/blog/static/2318226020098963825130/

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2