上一篇文章中说道,Struts2不是Struts1的升级,它们之间并没有什么血缘的关系。那么,它们两者之间的区别到底是什么?下面,且听小编给您娓娓道来。
Action类
- Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口
- Struts2中,Action类可以实现一个Action接口,也可以实现其他接口使可选和定制的服务成为可能。Struts2提供了一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象
线程模式
- Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求,存在线程的安全性问题
- Struts2 Action对象为每一个请求产生一个实例,是多实例的,在线程上没有安全问题
Servlet依赖
- Struts1 Action依赖于Servlet API,因为当一个Action被调用时,HttpServletRequest和HttpServletResponse被传递给execute方法
- Struts2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始化的Request和response。但是,其他的元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性
可测试性
- Struts1的Action测试性不好,由于Action依赖于Servlet API,所以需要容器支持
- Struts2的Action测试性好,因为Struts2的Action是一个POJO对象,所以可以直接写一个单元测试完成
ActionForm
- Struts1收集数据通常使用ActionForm,而ActionForm还需要继承,使ActionForm的复用率降低。另外项目非常大会建立很多ActionForm给维护带来工作量,但也有好处:数据的收集和控制进行了很好的分离。
- Struts2直接用Action来收集数据,也可以采用ActionForm。Struts2采用了ModelDriven的方式来支持类似的Struts1的ActionForm方式,比较灵活。
表达式语言
- Struts1整合了JSTL,这种EL有基本的对象遍历,但是对集合和索引属性的支持很弱。
- Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言——OGNL(Object Graph Notation Language)
绑定值到页面(View)
- Struts1使用标准的JSP机制把对象绑定到页面中来访问
- Struts2使用“ValueStack”技术,使taglib能够访问而不需要把你的页面和对象绑定起来。
类型转换
- Struts1 ActionForm的类型转换采用commons-beanutils工具,而定义完成一个转换器,将对所有的ActionForm起作用,而不能针对某一ActionForm来配置是否使用此类型的转换器
- Struts2使用OGNL进行类型转换,功能更加强大,转换过程可以针对某个类型进行配置
校验
- Struts1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
- Struts2支持通过validate方法和XWork校验框架进行校验。
Action执行控制
- Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期
- Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用
通过上边的详细对比,读着应该对Struts1与Struts2两者之间的差别,有了一定程度上的了解。同时,也应该明白,Struts2是WebWork的升级,而不是Struts1.x的升级。虽然Struts2提供了与Struts1.x的兼容,但已经不是Struts1.x的升级。对于已有已有Struts1.x开发经验的开发者而言,Struts1.x的开发经验对于Struts2并没有太大的帮助;相反,对于已经有WebWork开发经验的开发者而言,WebWork的开发经验对Struts2的开发将有很好的借鉴意义。