Sruts2从本质上来看源于Webwork,它同时具有Struts和Webwork的优点,并且使用了java1.5的注释为程序员提供了另外一种配置方案,虽然Struts2有许多优点,但它在使用上和Struts1.x有很大的不同。因此,要想从Stuts1.x跨越到Struts2,还需要进一步学习。因此要想从Struts1.x跨越到Struts2,还需要进一步学习。因此,本章全面介绍Struts 2的工作原理以及它与Struts 1.x的区别。Struts2虽然是在Struts 1的基础上发展起来的,但实质上市以webWork为核心,Struts 2为传统Struts 1注入了WebWork的设计理念,统一了Struts1和WebWork两个框架,允许Struts1和WebWork开发者同时使用Struts 2框架。对于传统的Struts 1.x开发者,Struts 2也提供了很好的向后兼容性,Struts 2可与Struts 1.x有机整合,从而保证Struts 1.x开发者能平稳过渡到Struts 2。
Action类:
Struts1.x:struts1.x 要求Action继承一个抽象基类;Struts 1.x的一个具体问题是使用抽象类编程而不是接口。
Struts2.x:Struts2.x的Action类可以实现一个Action接口,也可以实现其他接口,联同其他接口一起来实现可选择和自定义的服务。Struts2.x提供一个名叫ActionSupport的基类来实现一般使用的接口。当然Action接口不是必须的,任何使用execute方法的POJO对象可以被当作Struts 2.x的Action对象来使用。
线程模型:
Struts1.x:struts1.x 的Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有请求,单例类策略造成了一定的限制,并且给开发带来了额外开销。Action资源必须是线程安全或者同步的。
Struts2.x:struts2.x的Action对象为每一个请求产生一个实例,因此没有线程安全问题。
可测试性:
Struts1.x:测试Struts 1.x的Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试要依赖Web容器,为了脱离Web容器测试Struts1.x的Action,必须借助于第三方扩展,若Struts TestCase,提供了一套Struts1的模拟对象来进行测试。
Struts2.x:Struts 2.x的Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也使测试变得更简单。
Servlet依赖:
Struts1.x:struts 1.x的Action类依赖于servlet API,但Action被调用时,以HttpServletRequest和HttpServletResponse作为参数传给execute方法.
Struts2.x:struts 2.x的Action不再依赖于Servlet API从而允许Action脱离Web容器运行,允许Action被独立的测试。从而降低了测试Action的难度,当然,如果Action需要直接方法HttpServletRequest和HttpServletResponse参数,Struts 2.x的Action仍然可以访问他们。一般情况下,Action都无需直接访问HttpServletRequest和HttpServletResponse从而给开发者更多的灵活选择。
封装请求参数:
Struts1.x:struts 1.x使用ActionForm对象来捕获输入。像Action一样,所有的ActionForm必须扩展基类。因为其他的JavaBean不能作为ActionForm使用,开发者经常创建多余的类来捕获输入。DynamicBeans可以被用来作为替代ActionForm的类来创建。但是,开发者可能是在重新描述已经存在的JavaBean。
Struts2.x:Struts2.x直接使用Action属性作为输入属性,消除了对第二输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2.x也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven特性简化了taglib对POJO输入对象的引用。
表达式语言:
Struts1.x:Struts1.x整合了JSTL,因此可以使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上很弱。
Struts2.x:Struts2.x可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此Struts2.x下的表达式语言功能更加强大。
绑定值到视图:
Struts1.x:struts1.x使用标准JSP机制来绑定对象到页面上下文。
Struts2.x:struts2.x使用“ValueStack”技术,使用taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换:
Struts1.x:struts1.x的ActionForm属性经常都是String。Struts1.x使用Commons-Beanutils来进行类型转换。转换每一个类,而不是为每一个实例配置。
Struts2.x:struts2.x使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换.
数据校验:
Struts1.x:struts1.x支持ActionForm重写validate方法中手动校验,或者通过Commons-Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
Struts2.x:struts2.x支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。
Action执行控制:
Struts1.x:Struts1.x支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的声明周期。
Struts2.x:struts2.x支持通过拦截器堆栈(Interceptor Stacks)为没一个Action创建不同的声明周期。开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。
注:Struts2提供了与Strus1.x的兼容,当已经不是Struts1.x的升级。