Action
Struts1 要求Action类要扩展一个抽象基类。Struts1 的一个共有的问题是面向抽象类编程而不是面向接口编程。
Struts2 的Action类实现了一个Action接口,连同其他接口一起来实现可选择和自定义的服务。Struts2 提供了ActionSupport基类来实现一般使用的接口。
线程模型
Struts1 的Action是单例类,所以要考虑线程安全的问题。
Struts2 为每一个请求实例化一个Action类对象,所以不会出现线程安全的问题。
Servlet依赖
Struts1 的Action类依赖Servlet,需要以HttpServletRequest和HttpServletResponse作为参数传递给execute方法。
Struts2 的Action和容器无关,Servlet上下文被表现为简单的Maps,允许Action被独立的测试。
表达式语言
Struts1 使用JSTL,对集合和索引属性的支持很弱。
Struts2 不仅支持JSTL,还支持一个更强大和灵活的语言OGNL。
类型转换
Struts1 的ActionForm属性经常是String,使用Commins-Beanutils进行类型转换。
Struts2 使用OGNL进行类型转换,提供基本和常用对象的转换器。
验证
Struts1 在ActionForm的Validate的方法中手动脚丫,或者通过Commons Validator的扩展校验,同一个类可以有不同的校验内容。
Struts2 支持Validate方法,也支持XWork校验框架进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验。
测试
Struts1 测试依赖容器,可以用Struts TestCase测试。
Struts2 的Action通过初始化,设置属性,调用方法来测试。
Action生命周期
Struts1 每一个模块有单独的生命周期,但模块中的所有Action有相同的生命周期。
Struts2 通过拦截器为每个Action创建不同的生命周期。