`
pcno1
  • 浏览: 21565 次
社区版块
存档分类
最新评论

[转]WebWork2与Struts简单比较

阅读更多


[原创]WebWork2与Struts简单比较


网上关于WebWork2与Struts比较的文章已经很多了,我在这里并不想重新发明轮子。我只是把我在实际应用中的一些感受记录下来。大家觉得有什么不对的,可以一起讨论。hotjava@126.com

WebWork2与Struts比较
前言
WW2的目前最新版本是webwork-2.1.7,但是由于2.1.7开始用的是XmlHttpRequest,但是还不成熟.所以选用2.1.6版本,而Struts采用1.1版本,由于两者都是比较完善,流行的MVC框架,所以我尽量从实际应用出发进行比较。
框架介绍
Struts
Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,最早由Craig R. McClanahan编写,并且在2000 年的时候捐献给了ASF,
WebWork
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。
工作原理
Struts
首先,HTTP的客户请求信息现提交到控制器(ActionServlet),控制器(ActionServlet)将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器,处理器在将请求转移到一个Action实例时, 如果这个实例不存在,控制器会首先创建,然后会调用这个Action实例的execute()方法,再转发到其他的Action或者jsp页面。
WebWork
WebWork框架的控制器是ServletDispatcher,是默认的处理Web Http请求的调度器,它是一个JavaServlet,是WebWork框架的控制器。所有对Action调用的请求都将通过这个ServletDispatcher调度。它将在web.xml里配置ServletDispatcher时指定,让所有对WebWork 的Action(默认的是.action的后缀)的请求都对应到该调度的JavaServlet中。
ServletDispatcher接受客户端的HTTP请求,将JavaServlet的很多相关对象进行包装,再传给我们的XWork框架,由我们的XWork框架去解析我们的xwork.xml配置文件,根据配置文件的信息,创建对应的Action,组装并调用相应的拦截器,执行Action,返回执行结果。WebWork使用XWork的核心,主要是由这个ServletDispatcher去实现的。
两者比较差异
主要区别
Webwork支持Interceptor(拦截器)框架,XWork Interceptor(拦截器)将Action共用的行为独立出来,在Action执行前后运行。这也就是我们所说的AOP(Aspect Oriented Programming,面向切面编程),它是分散关注的编程方法,它将通用需求功能从不相关类之中分离出来,当你提交对Aciton的请求时,ServletDispatcher会根据你的请求,去调度并执行相应的Action。在Action执行之前,调用被 Interceptor截取,Interceptor在Action执行前后运行。
1.        配置和Action方面:
(1)两者在action,页面跳转配置xml文件方面基本上差不多,只是webwork在支持Velocity上面比struts简单的多,直接把输出格式定位Velocity就行了,如 <result name="success" type="velocity">,而strust是通过Velocity tools解决的,比较麻烦。WebWork2支持JSP,Velocity,xslt等多种表现层技术,而且调用比较方便。
(2)Struts的多模块式通过用多个配置文件分割实现的,而webwork则是通过导入其他配置文件实现的,最大的区别就是webwork的包和命名空间的概念。并且,包支持继承。
也就是说,可以定义一些通用跳转和拦截器,然后其他包继承此包,并用有此包属性。
(3)Webwork可以通过参数指定webwork配置文件加载方式,webwork提供每次httpRequest请求时load配置文件,所以不用像struts那样每次重起web容器。
(4)网上多数文章认为ww2比较struts的一个优点是,ww2的Action是实现其Action接口,而Struts则必须继承Action类,但是实际的情况是,由于我们在使用WebWork2的时候,都会采用推荐的模型驱动(Model-Driven),和客户端验证,所以必须要继承ActionSupport而且要实现Action,ModelDriven接口,所以,这一点上,和Struts基本是一样的,标准的WebWork2的Action类的定义:public class PersonAction extends ActionSupport implements Action,ModelDriven
(5)在实现功能划分的时候,Struts采用继承DispatchAction的方式实现,URI直接根据参数调用Action中的相应方法,URI如:
/person.do?method=doList
而WebWork2是继承ActionSupport类,URI根据!后面的参数掉用相应Action中的方法,如:
/person!list.action
两者在应用上区别不大。
2.        数据获取
WebWork没有FormBean,,Action 分Field-Driven(字段驱动的)Action和Model-Driven(模型驱动的)Action,它们的功能是,从页面上获得数据。
字段驱动的是Action将直接用自己的字段来充当FormBean的功能
模型驱动的是普通JavaBean充当模型部分。
由于支持这两种方式,所以webwork应用起来比较灵活。
3.        数据验证方面:
(1)        后台验证:
Struts是通过FormBean中validate()方法实现的。Webwork是通过配置一个validationWorkflowStack   interceptor 和一个和命名规则为Action类名-validation.xml 或 Action类名-Action别名-validation.xml 的xml文件实现的
        (2)前台验证:
Struts 通过 配置validation.xml,validator-rules.xml来实现,可以根据validators.xml中规则写一个或多个validation.xml文件来验证应用中所有的FormBean。而 Webwork是根据validators.xml中规则,针对每一个action配置一个.xml文件。并且要放到与action相同的目录里。

?        注意:这里存在一个重要的问题,我没有解决,就是如果使用webwork2的前台验证,每一个action都必须要有一个没有转发类型的入口地址,如:<result name="input">index.jsp</result>,但是这样造成一个问题,就是我们实际开发过程中,不可能给每一个提交操作都配置一个action,也就是说,一个action中可能要包含多个提交操作,这样,webwork2的客户端验证就没法使用。(这个问题我没有解决,在网上一些技术论坛里页没有得到满意的答案)
4.        与Spring结合
Strust是在Action请求开始,实例化Spring中配置的BO,而WebWork不但支持这种方式,也支持一个webwork2-spring插件的方式,这种方式实际上是在interceptors 中增加了一个用于获得外部引用的拦截器ExternalReferencesInterceptor,然后再在相应的Action中进行配置,
如:<external-ref name="personBO">personBO</external-ref>,
然后再action调用,如:
  private PersonBO personBO;

  public PersonBO getPersonBO() {
    return personBO;
  }

  public void setPersonBO(PersonBO personBO) {
    this.personBO = personBO;
  }
就可以得到spring中映射的BO了。

5. 测试
由于Webwork是与容器无关的,所以WebWork的测试用例和普通的java类的测试用例的写法基本上是一样的,而Struts可以通过外部扩展的StrutsTestCase工具来实现测试功能,相对于Webwork,配置相对复杂。
?        注意:由于使用了webwork2-spring插件,所以我在进行测试的时候,出现了一些问题,主要是得不到BO,这个问题应该能够解决,但是我在论坛上也没有得到满意的答案,说明,WebWork的资料和受关注呈度还比较欠缺。
6.  界面显示技术
   WebWork2和Struts的标签库都比较丰富,都是基于OGNL(Object-Graph Navigation Language)语言的,基本需要的功能都能够保障实现,WebWork只需要包含一个webwork.tld标签库文件,而Struts则需要包含多个,
在异常处理方面,Struts的标签出错页面一般就是一个空白页面,比较难调整,而WebWork2则友好很多,易于调试。
WebWork2和Struts都支持JSP,Velocity,xslt等技术,但是,Webwork2能更方便的实现。
另,Velocity是一中模版技术,由Apache提出,由另外一种引擎技术Webmacro引深而来,他关注在Model和View之间,可以代替Jsp,它的主要做用是将java代码从web页面中分离出来.
7.性能方面

压力测试共进行了4次,采用同一个容器(jakarta-tomcat-5.0.28),同一个持久层架构(spring1.1.5+hibernate 2.1.2),同一个数据库(mysql-4.1.12),同一个操作系统(Win2K),同样的数据连接池(DBCP Max. Active Connections: 2000 ,Max. Idle Connections 100)


        第一次
Stress Level       10
Stress Multiplier    3
Test Run Time     10       
50
3
10       
100
3
10       
500
3
10
Struts        Requests per Second:  36.90        36.81        34.43        26.45
WebWork        Requests per Second:  35.71        37.46        33.66        27.71


说明:只测试查询操作。

两者性能上基本相同。
8.国际化支持(i18N)
  基本相同,都是通过配置资源文件,然后利用标签库进行调用,只是语法少许不同。
9.学习曲线
  相比之下,Struts的标签库比较庞大,不实用的标签很多,而且一些标签使用过于灵活,相比之下WebWork标签库更为简单,学习速度快。WebWork的配置也要比Struts简单一些,所以学习起来相对简单。

 


由于我写的是word文档,所以贴到这里,格式有一点凌乱。中间的性能测试由于是表格没有显示,但大体内容就是测试的数据基本差不多。如果有兴趣要测试和编写的源代码,可以给我发邮件。
中国安全信息网:http://www.hacker.cn

 

 

 
分享到:
评论

相关推荐

    struts2与webwork2

    在探讨Struts2与WebWork2的联系与区别的过程中,我们不得不提到它们的历史渊源以及在Java Web开发领域中的地位。Struts2框架实际上可以视为WebWork2框架的继承者,两者之间的关系紧密而复杂,下面将从多个角度深入...

    Struts 2 技术详解:基于WebWork核心的MVC开发与实践

    **Struts 2与WebWork的结合**: Struts 2 的核心技术基础是WebWork,它在Struts 1的基础上进行了许多改进,如更强大的表达式语言(OGNL)、拦截器机制、更简单的配置等。WebWork的这些特性被集成到Struts 2中,使得...

    webwork开发文档 struts2学习助手

    【Webwork2 简介】 WebWork是由OpenSymphony组织开发的Java企业级Web框架,专注于组件化和代码重用。...WebWork与Struts的相似之处在于Action的使用和配置方式,使得从Struts过渡到WebWork相对平滑。

    struts2中文学习文档

    从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...

    webWork2开发指南

    7. **国际化与本地化**:WebWork2支持多语言环境,你可以通过简单的配置来实现应用的国际化和本地化,提供不同地区的用户界面。 8. **异常处理**:WebWork2的异常处理机制允许开发者定义全局和特定Action的异常...

    Struts 2 began as WebWork.

    Struts 2的诞生是在2005年,当Apache软件基金会决定将WebWork与Apache Struts 1.x合并,以创建一个更强大、更现代的框架。这次合并的结果就是Struts 2,它继承了WebWork的强大功能,并融合了Struts 1的社区支持和...

    WebWork2配置

    WebWork2是Struts的替代品,它提供了更强大的功能、更好的性能以及更优雅的API。在这个“WebWork2配置”主题中,我们将深入探讨如何设置和优化WebWork2框架,以便在你的项目中实现高效且可维护的代码。 首先,...

    webwork与struts处理上的异同(1) .txt

    通过对Struts与WebWork处理机制的比较,我们可以看到两者在配置方式、视图层技术、模型层封装以及控制器层设计等方面存在一定的差异。开发者可以根据实际项目的需要选择合适的框架进行开发,以达到最佳的应用效果。...

    Struts2工作流程图

    Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度上来讲,Struts2没有继承Struts 1的血统,而是继承WebWork的血统。...

    浅谈Struts2与Webwork的不同和相同点

    此外,Struts2舍弃了WebWork内置的IoC容器,转而全面拥抱Spring的IoC容器,这样可以利用Spring丰富的依赖注入功能,提升系统的可维护性和可扩展性。 在视图层,Struts2提供了自己的标签库,这些标签在功能上与...

    java私塾][Spring讲解+webwork2整合+webwork2整合全套

    根据提供的文件信息,我们可以推断出这是一篇关于Java私塾中的Spring框架讲解与WebWork2整合教程的文章。下面将围绕这些关键词展开详细的讲解。 ### Spring框架基础 #### Spring简介 Spring是一个开源框架,最初由...

    Struts 2权威指南--基于WebWork核心的MVC开发

    #### 三、Struts 2与Struts 1及WebWork的关系 **1.4 Struts 2与Struts 1的区别** 虽然Struts 2和Struts 1都属于MVC框架,但是它们之间存在着显著的不同: - **架构上的差异**:Struts 2采用了拦截器机制,而Struts...

    struts2简单入门教程

    Struts2的配置方式与Struts1有很大的不同。在Struts1中,主要使用struts-config.xml文件进行配置,而在Struts2中,虽然依然可以使用XML配置,但同时也提供了注解和Java配置的方式,使得整个流程更加灵活和简洁。 ...

    Struts2中关于ValueStack的一些操作

    2、 EL,全称Express Language,即表达式语言。不要被语言吓倒,它是简单的对象导航语言。有字符串(例如:方法名)和特殊字符组成(例如用.表示调用对应的属性方法)。通过EL,我们可以存、取对象数据,而且还可以...

    struts2权威指南-基于webwork核心的MVC开发

    总的来说,《Struts2权威指南——基于WebWork核心的MVC开发》这本书涵盖了Struts2框架的各个方面,从基本概念到高级特性,从简单应用到复杂场景,深入浅出地介绍了如何利用Struts2进行Web开发。通过学习,开发者不仅...

    WebWork2中文手册

    通过阅读提供的"struts2.pdf"文档,你可以深入理解Struts2框架的各个方面,包括Action、Interceptor、Ognl的使用、配置文件详解、异常处理策略、以及如何将Struts2与现有的Java企业级技术栈(如Spring、Hibernate)...

    留言板留言板struts2留言板struts2

    这个"留言板留言板struts2"项目,显然是一个基于Struts2实现的简单留言板系统,旨在展示Struts2的核心功能和开发流程。下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:...

    struts2登录注册简单实现

    Struts2是Apache软件基金会的一个开源项目,它继承了Struts1的优点并吸收了其他优秀框架如WebWork的优势。Struts2的核心是Action,它是业务逻辑的载体,与视图和模型进行交互。框架通过拦截器机制实现了灵活的请求...

    Struts2.0学习系列 包括webwork

    此外,Webwork的ValueStack对象则简化了模型与视图的数据传递,使得在JSP页面中直接使用Ognl(Object-Graph Navigation Language)表达式来访问和操作对象属性变得简单直观。 在本学习系列中,"Struts2.0学习系列....

Global site tag (gtag.js) - Google Analytics