特性 | Struts 1 | Struts 2 |
Act | Struts 1要求Act | Struts 2的Act |
綫程模型 | Struts 1 Act | Struts 2 Act |
Servlet依賴 | Struts 1的Act | Struts 2的Act |
易測性 | 測試Struts 1的主要障礙是execute方法暴露了Servlet API。第三方的擴展,Struts測試用例,提供Struts 1的集合對象。 | Struts 2的Act |
接受輸入 | Struts 1使用ActionForm對象麳捕獲輸入。象Act | Struts 2 Act |
表達式語言 | Struts 1整和JSTL,所以它使用JSTL的表達式語言。表達式語言有基本的圖形對象移動,但是相對很弱的集合和被索引的屬性支持。 | Struts 2使用JSTL,但是框架也支持更强大和更靈活的表達式,叫做“對象圖形符號語言”(OGNL)。 |
將值綁定要視圖上 | Struts 1使用標準JSP機製來綁定對象到頁面上下文。 | Struts 2使用“ValueStack”技術爲了標簽庫可以不用鏈接你的視圖到對象的表現類型麳訪問值。ValueStack策略允許重用視圖。 |
類型轉換 | Struts 1的ActionForm屬性經常都是String的。Struts 1使用Commons-Beanutils麳類型轉換。轉換每一個類,幷不是爲每一個實例配置。 | Struts 2使用OGNL麳類型轉換。框架包含轉換器麳爲基本的和共同的對象類型和原始類型。 |
驗證 | Struts 1支持手動驗證憑借ActionForm的validate方法,或者通過擴展的公用驗證器。類可以有不同的驗證上下文麳未相同的類,但是不能不能包括驗證子對象。 | Struts 2支持手動驗證憑藉validate方法和XWork驗證框架。Xwork驗證框架支持一連串的驗證子屬性使用的驗證爲了屬性類的類型和嚴正上下文而定義。 |
Act | Struts 1支持獨立的請求處理器對于每一個模型,但是所有在模型中的Act | Struts 2支持在每一個Act |
struts已经是mvc开发的标准,但随着webwork和struts的合并(Struts2),试问将来struts还用不用于开发项目,struts2是否会取代struts?
下面简单介绍写两者的区别和发展。
struts是2001年发布的。这个发布时间比webwork早一年,IT世界就是这个原理,时间决定一切。早一分钟还晚一分钟可能会导致两重天。由于企业迫切需要个mvc开发标准,因此struts自然荣登宝座。但是虽然框架的发展,struts显出拉很多弊病。比如说它的act
经过六年多的发展,Struts1已经成为了一个高度成熟的框架,不管是稳定性还是可靠性都得到了广泛的证明。市场占有率超过20%,拥有丰富的开发人群,几乎已经成为了事实上的工业标准。但是随着时间的流逝,技术的进步,Struts1的局限性也越来越多地暴露出来,并且制约了Struts1的继续发展。
对于Struts1框架而言,由于与JSP/Servlet耦合非常紧密,因而导致了一些严重的问题。首先,Struts1支持的表现层技术单一。由于Struts1出现的年代比较早,那个时候没有FreeMarker、Velocity等技术,因此它不可能与这些视图层的模版技术进行整合。其次,Struts1与Servlet API的严重耦合,使应用难于测试。最后,Struts1代码严重依赖于Struts1 API,属于侵入性框架。
从目前的技术层面上看,出现了许多与Struts1竞争的视图层框架,比如JSF、Tapestry和Spring MVC等。这些框架由于出现的年代比较近,应用了最新的设计理念,同时也从Struts1种吸取了经验,克服了很多不足。这些框架的出现也促进了Struts的发展。目前,Struts已经分化成了两个框架:第一个是在传统的Struts1的基础上,融合了另外的一个优秀的Web框架WebWork的Struts2。Struts2虽然是在Struts1的基础上发展起来的,但是实质上是以WebWork为核心的。Struts2为传统的Struts1注入了WebWork的先进的设计理念,统一了Struts1和WebWork两个框架。Struts1分化出来的另外一个框架是Shale。这个框架远远超出了Struts1原有的设计思想,与原有的Struts1关联很少,使用了全新的设计思想。Shale更像一个新的框架而不是Struts1的升级。 本文下面的内容将主要讨论Struts2。
二.Struts2体系结构
Struts2的体系与Struts1体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而允许用户的业务逻辑控制器与Servlet API分离。图一是Struts2的体系结构简图。
Struts2框架的大概处理流程如下:
- 浏览器发送一个请求。
- 核心控制器FilterDispatcher根据请求决定调用合适的Act
ion。 - WebWork的拦截器链自动对请求应用通用功能,如验证等。
- 回调Act
ion的execute方法,该execute方法根据请求的参数来执行一定的操作。 - Act
ion的execute方法处理结果信息将被输出到浏览器中,支持多种形式的视图。
三.Struts2和Struts1的对比
通过上面对Struts2体系结构的了解,我们发现Struts2对Struts1进行了巨大的改进。主要表现在如下几个方面:
- 在Act
ion的实现方面:Struts1要求必须统一扩展自Act ion类,而Struts2中可以是一个普通的POJO。 - 线程模型方面:Struts1的Act
ion工作在单例模式,一个Act ion的实例处理所有的请求。Struts2的Act ion是一个请求对应一个实例。没有线程安全方面的问题。 - Servlet依赖方面:Struts1的Act
ion依赖于Servlet API,比如Act ion的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Act ion不再依赖于Servlet API,有利于测试,并且实现TDD。 - 封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Act
ion的属性。 - 表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph Notation Language)。
- 绑定值到视图技术:Struts1使用标准的JSP,Struts使用“ValueStack”技术。
- 类型转换:Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。
- 数据校验:Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
- Act
ion执行控制的对比:Struts1支持每一个模块对应一个请求处理,但是模块中的所有Act ion必须共享相同的声明周期。Struts2支持通过拦截器堆栈为每一个Act ion创建不同的声明周期。
四.WebWork和Struts2的对比
从某种程度上看,Struts2是从WebWork2上升级得到的。甚至Apache的官方文档也讲:WebWork2到Struts2是平滑的过渡。我们甚至也可以说Struts2就是WebWork2.3而已。在很多方面Struts仅仅是改变了WebWork下的名称。
Act
? Struts1要求Act
? Struts 2 Act
线程模式:
? Struts1 Act
? Struts2 Act
Servlet 依赖:
? Struts1 Act
? Struts 2 Act
可测性:
? 测试Struts1 Act
? Struts 2 Act
捕获输入:
? Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。
? Struts 2直接使用Act
表达式语言:
? Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
? Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).
绑定值到页面(view):
? Struts 1使用标准JSP机制把对象绑定到页面中来访问。
? Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换:
? Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
? Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验:
? Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
? Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
Act
? Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Act
? Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Act