Struts2与Struts1的比较摘录整理

news/2024/7/7 15:55:29 标签: struts, action, servlet, interceptor, 测试, 扩展
特性
Struts1.x
Struts2
Action
Struts1.x要求Action类要扩展自一个抽象基类。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一起使用。

Struts2与Struts1在使用上的差异:

1、Action的编写无需继承特殊的基类

2、取消了ActionForm,页面参数被直接设置到Action对象的属性上

3、每个请求都会创建一个Action的对象

4、Action的方法可以不依赖于任何Servlet API

Struts2与Struts1在设计上的主要差别在于: 

 1、Struts2中的请求处理过程由拦截器模式定义为一个可插拔的、容易扩展的结构,而不是像Struts1

   中,其处理过程是固定不变的

2、Struts2中的参数从页面传递到Action,以及将数据从Action传输到页面,都通过OGNL来进行,

   Struts1中的参数从页面传输到Action是通过Apache-commons-beanutils工具包来解析的,而

   将数据从Action传输到页面则通过request对象来传输


http://www.javabk.com/archieves/struts1-struts2/
http://tech.it168.com/oldarticle/2007-07-13/200707131009859_4.shtml


http://www.niftyadmin.cn/n/748902.html

相关文章

《HelloGitHub》第 46 期

兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 米妮小说网 www.amini.net 分享 GitHub 上有趣、入门级的开源项目。 这是一个面向编程新手、热爱编程、对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编程语言的项目、…

好的程序员也是一名优秀的管理者

好的程序员也是一名优秀的管理者,只不过他管理的对象是代码,而且是自己创建的。而企业管理者的管理对象基本都是买回来的,不过一样有重构、重组,分部门,开会,信息要沟通,资源要分配,…

Spring 总结

原文:http://blog.csdn.net/xwchen/archive/2007/04/06/1554245.aspx spring 7大组成模块: 1:spring core:提供了spring 的核心功能,BeanFactory是spring核心容器的主要组件, 它通过Ioc把程序的配置和依赖性与实…

C++ 一篇搞懂多态的实现原理

虚函数和多态 不格 m.vbuge.com 01 虚函数 在类的定义中,前面有 virtual 关键字的成员函数称为虚函数;virtual 关键字只用在类定义里的函数声明中,写函数体时不用。 class Base {virtual int Fun() ; // 虚函数 };int Base::Fun() // virt…

CSS层级嵌套关系详解

如果同个元素有两个或以上冲突的CSS规则,浏览器有一些基本的规则来决定哪一个非常特殊而胜出。 它可能不像其它那么重要,大部分案例你不需要担心冲突,但大型而且复杂的CSS文件,或有很多CSS文件组成的,可能产生冲突。 选…

深入理解设计模式六大原则

深入理解设计模式六大原则 无广告小说网 https://www.amini.net 万变不离其宗,不管是Java还是C,凡是面向对象的编程语言,在设计上,尽管表现形式可能有所不同,但是其实质和所需遵守的原则都是一致的。本文便是带领读者去…

Java程序员学习Go指南(一)

转载:https://www.luozhiyun.com/archives/206 GOPATH 工作空间 米妮 m.amini.net GOPATH简单理解成Go语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个目录都代表Go语言的一个工作区(workspace&am…

jquery.ui.datepicker.js 设置默认日期

defaultDate:2011-03-10,//设定默认日期,可以是字符串也可以是日期类型 $("#index-datepicker").datepicker({ changeMonth: true, changeYear: true, showButtonPanel: false, dateFormat: mm/yy, defaultDate: -1M,…