看看别人的总结:前4个缺点是致命的,
Action
类
|
在
Struts
里面,每一个
Action
类必需要继承一个抽象的类
org.apache.struts.action.Action
。这个在
Java
编程中会引来一些问题,就是关于多种继承的问题。
|
WebWork
的
Action
类仅需要实现接口
com.opensymphony.xwork.Action
,也可以实现其它的接口来实现更多的功能,譬如:
validate
(验证),
localware(
国际化
)
等。当然,它也提供了一个类
ActionSupport
集成了上面的所有功能,我们在开发中可以根据需要选择。
|
线程模型
|
Struts
的
Action
必需是
thread
-
safe
方式,它仅仅允许一个实例去处理所有的请求。所以
action
用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
|
在
WebWork
中,每个请求对应一个
Action
,因此没有线程的安全问题。实际上
Servlet
容器对每个请求也产生多个对象,它也没有证明对性能和垃圾回收产生太多的影响。
|
Servlet
的依赖
|
Struts
处理
Action
时必需要依赖
ServletRequest
和
ServletResponse
,所有它摆脱不了
Servlet
容器。
|
WebWork
的
Action
不用依赖
Web
层和其它的容器。它可以通过
ActionContext
,直接去访问
Request
和
Response
,但这个是可选的,只有在必需的请求下使用。
|
测试
|
Struts
的每个
Action
都同
Web
层耦合在一起,这样它的测试依赖于
Web
容器,单元测试也很难实现。不过有一个
Junit
的扩展工具
Struts TestCase
可以实现它的单元测试。
|
Webwork
的
action
能够通过赋予一定的属性,就可以执行单元测试。同时也可以使用一个
mock
的实例去测试,而不是通过启动
web
容器来进行测试。
|
FormBean
|
Struts
要求有
FormBean
对应每一个表单,而且
FormBean
必需继承抽象类
ActionForm
。而使用
DynaBeans
实际上没有太大的意义。不能够很好的处理现有的模型。
|
Webwork
能够动态的收集
web
的数据然后再赋值给
bean
。它也可以使用
FormBean
的形式,
FormBean
可以是普通的
DTO
和域对象,它不用重新根据域对象来生成新的
FormBean
,也不需继承抽象类
ActionForm
。
|
前端表达式语言
|
Struts
集成了
JSTL
,所以它主要使用
JSTL
的表达式语言来获取数据。可是
JSTL
的表达式语言在
Collection
和索引属性方面处理显得很弱。
|
WebWork
的表达式语言使用了功能强大的
OGNL
。它使用
OGNL
建立一个
OgnlValueStack
来搜索数据。
Webwork
前端也可以使用
JSTL
,但它同时支持:
velocity
、
freemaker
、
jspparer
、
xml
。
|
类型的转换
|
Struts
的
FormBean
把所有的数据都作为
String
类型,它可以使用工具
Commons-Beanutils
进行类型转化。但它的转化都是在
Class
级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
|
WebWork
使用
OGNL
进行类型转化,提供了所有基本类型的转化功能。类型转化可以直接对一个
Class
进行(
Class
级别)转化,也可以对
Class
的字段进行类型转化。它使用拦截器可以很容易的将类型转化的错误信息返回给用户,而且错误信息可以对应到一个相应的字段。
|
对
Action
执行前和后的处理
|
Struts
处理
Action
的时候是基于
class
的
hierarchies
,很难在
action
处理前和后进行操作。
|
Webwork2
允许您处理
Action
可以通过拦截器,就是在每一个
Action
处理前或者后进行其它操作。它的拦截器可以在配置文件中动态添加,这样
Action
和拦截器之间完全解藕,更好的实现了组件化。
|
验证处理
|
Struts
的验证是调用
FormBean
的
validator()
方法,其实就是对
FormBean
的验证。它一般使用框架
Commons Validation
进行数据验证处理。它使用了一个全局的配置文件
validation.xml
定义了
FormBean
的验证信息。
Struts
的
FormBean
属性都被认为是
String
类型,所以它在验证时也需要额外的类型转化。
|
WebWork
使用
Xwork
的验证框架进行验证处理,它可以通过配置拦截器来激活。它可以为每个需要验证的
Class
指定一个
xml
验证文件,也可以为一个
Class
在不同的情况指定不同的
xml
验证文件。
WebWork
证可以给每个
Action
类指定对应的验证文件,也可以给
Action
的字段去指定验证文件。通过拦截器来组装
Action
和其验证文件,使它们之间完全解藕。
|
对
Action
执行的控制
|
Struts
创建一个
Action
,如果想控制它的执行顺序将会非常困难。甚至你要重新去写
Servlet
来实现你的这个功能需求。
|
在这个方面,
WebWork
的拦截器栈提供了强大的功能。
Action
的所有切面功能都有拦截器来实现(比如:取得
request
请求参数、验证处理等),这样你就可以用拦截器栈来组织拦截器的执行顺序。例如:你需要在使用
request
请求参数来设置
Action
属性之前,使用
IoC
框架设置
Action
的属性,反之已然。这时,你就可以为
package
或
Action
指定一个拦截器栈来实现。
|
下面是我在研究
WebWork
时,使用的资源和研究过的项目,希望能对你能有帮助。
1、
当然就是
WebWork
的官方网站:
http://www.opensymphony.com/webwork/
里面有最新的
WebWork
文档和它的一个
wiki
2、
一本好书:
Java Open Source Programming : with XDoclet, JUnit, WebWork, Hibernate
,里面有很好的
WebWork
教程。它附带的源代码可以去
http://www.amazon.com/
下载,里面的
petsoar
是一个非常好的
WebWork
开源项目。
3、
Confluence
(
http://www.atlassian.com/software/confluence
)是专业的
J2EE wiki,
用于知识管理和项目组交流。它使用的架构是
webwork2+Spring+Hibernate
。
Confluence
虽是商业软件,不过对于
OpenSource
的项目它全部免费提供。它的架构思想很值得我们去学习。
4、
OpenReports(http://www.opensourcesoft.net)
是一个开源的项目,基于
Web
的报表系统。它用到的技术有:
WebWork 2.0
、
Velocity
和
Hibernate
。
http://www.opensymphony.com/