注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

庄庄的家

庄庄的家-网易博客

 
 
 

日志

 
 

webwork介绍  

2008-03-18 19:35:36|  分类: java试题 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天面试问到了webwork回答不了,其实上次就问到过了一下只是没有深入问,而自己只知道struts2引入了webwork却不知道webwork到底是啥东西。看来至少要把流行框架的概念性的东西给搞懂才行。

WebWork是建立在称为XWork的Command模式(是一种面向对象的设计模式,将行为封装,降低耦合,command是“命令,指挥,控制”的意思)框架之上的强大的基于Web的MVC框架。
WebWork2的特性包括:
灵活的Validation框架:允许你在XML文件中定义验证内容,在运行时通过Interceptor自动应用,因此完全脱离Action类。新版支持客户端验证。
Type conversion:允许你在类之间很容易转换对象。
OGNL(Object Graphical Navigation Language)表达式语言:允许动态对象图表遍历和方法执行,使用ValueStack透明访问多Beans的属性。WW2也具有使用JSTL的能力。
IoC(Inversion of Control)容器:管理组件的生命周期,使客户获得组件实例不需要创建注册类(与容器环境无关)。
FreeMarker Templates:使UI组件可重用,从而允许开发者容易定制Web页面的look & feel。
Interceptors:在Actions处理的前后动态拦截,以简单化Action代码,增加减少代码的机会。
支持I18N(本地化)。
容易和第三方软件集成,包括Hibernate, Spring, Pico, Sitemesh等。
支持多种视图技术,如JSP,Velocity,FreeMarker,JasperReports,XML等。
支持Packages和Namespaces,来管理Actions。

-------------------------

WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1WebWork2两个项目,如下示意图所示:

WebWork1

XWork1

WebWork2

Web

Non-web

Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph Notation Language),IoCInversion of Control倒置控制)容器等。

WebWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使用ServletDispatcherHTTP请求的变成Action(业务层Action), session(会话)application(应用程序)范围的映射,request请求参数映射。WebWork2支持多视图表示,视图部分可以使用JSP, Velocity, FreeMarker, JasperReportsXML等。

下面我们提到的WebWork将为WebWork2,使用的版本是2.1

-------------------------

工作原理
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简单一些,所以学习起来相对简单。

  评论这张
 
阅读(262)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017