特征 | Struts 1 | Struts 2 |
---|---|---|
动作类 | Struts 1需要Action类来扩展抽象基类。Struts 1中的一个常见问题是编程抽象类而不是接口。 | Struts 2 Action 可以实现一个Action接口以及其他接口,以实现可选和定制服务。Struts 2提供了一个基本的ActionSupport类来实现常用的接口。虽然,在Action接口不是必须的。具有执行签名的任何POJO对象都可以用作Struts 2 Action对象。 |
线程模型 | Struts 1 Actions是单例,必须是线程安全的,因为只有一个类的一个实例才能处理该Action的所有请求。单例策略对Struts 1 Action可以做的事情做出限制,需要特别注意开发。操作资源必须线程安全或同步。 | Struts 2为每个请求实例化了Action对象,因此没有线程安全问题。(在实践中,servlet容器每个请求生成许多丢弃对象,另外一个对象不会施加性能损失或影响垃圾回收)。 |
Servlet依赖关系 | Struts 1操作对servlet API具有依赖性,因为在调用Action时,HttpServletRequest和HttpServletResponse被传递给execute方法。 | Struts 2动作未耦合到容器。servlet上下文通常用简单的映射表示,允许单独测试操作。Struts 2如果需要,操作仍然可以访问原始请求和响应。然而,其他体系结构元素可以减少或消除直接访问HttpServetRequest或HttpServletResponse的需要。 |
可测性 | 测试Struts 1操作的主要障碍是执行方法暴露了Servlet API。第三方扩展,Struts TestCase,为Struts 1提供了一组模拟对象。 | 可以通过实例化Action,设置属性和调用方法来测试Struts 2操作。依赖注入支持还使测试更简单。 |
收获投入 | Struts 1使用ActionForm对象捕获输入。像Actions一样,所有ActionForms都必须扩展一个基类。由于其他JavaBeans不能用作ActionForms,因此开发人员通常会创建冗余类来捕获输入。DynaBeans可以作为创建常规ActionForm类的替代方法,但是在这里也可以重新描述现有的JavaBeans。 | Struts 2使用Action属性作为输入属性,消除了对第二个输入对象的需要。输入属性可能是可能具有自己属性的丰富对象类型。可以通过taglibs从网页访问Action属性。Struts 2还支持ActionForm模式,以及POJO表单对象和POJO操作。丰富的对象类型(包括业务或域对象)可以用作输入/输出对象。ModelDriven功能简化了对POJO输入对象的taglb引用。 |
表达语言 | Struts 1与JSTL集成,因此使用JSTL EL。EL具有基本的对象图遍历,但相对较弱的收集和索引属性支持。 | Struts 2可以使用JSTL,但该框架还支持一种称为“对象图符号语言”(OGNL)的更强大,更灵活的表达式语言。 |
将值绑定到视图中 | Struts 1使用标准JSP机制将对象绑定到页面上下文中进行访问。 | Struts 2使用“ValueStack”技术,使得taglib可以访问值,而不将视图与要渲染的对象类型相关联。ValueStack策略允许重复使用可能具有相同属性名称但不同属性类型的一系列类型的视图。 |
类型转换 | Struts 1 ActionForm属性通常都是字符串。Struts 1使用Commons-Beanutils进行类型转换。转换器是每类,而不是每个实例配置。 | Struts 2使用OGNL进行类型转换。该框架包括用于基本和通用对象类型和原语的转换器。 |
验证 | Struts 1通过ActionForm上的验证方法或通过Commons Validator的扩展来支持手动验证。类可以为同一类具有不同的验证上下文,但不能链接到子对象上的验证。 | Struts 2通过验证方法和XWork 验证框架支持手动验证。Xwork验证框架支持使用为属性类类型和验证上下文定义的验证来链接到子属性的验证。 |
控制行动执行 | Struts 1为每个模块支持单独的请求处理器(生命周期),但模块中的所有操作必须共享相同的生命周期。 | Struts 2支持通过Interceptor Stacks在每个Action基础上创建不同的生命周期。根据需要,可以创建自定义堆栈并使用不同的操作。 |
Struts 1和2 的区别
最新推荐文章于 2018-08-15 13:19:44 发布