The Spark of Thinking

Focus on Eclipse Tools.

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 27 文章 :: 4 评论 :: 0 Trackbacks

看看别人的总结:前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 的项目资源

下面是我在研究 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/

 

posted on 2006-07-21 16:59 The Spark of Thinking 阅读(338) 评论(1)  编辑  收藏 所属分类: Talk

评论

# re: 准备放弃struts,因为它是一个拙劣的设计! 2010-05-06 19:19 鼓励但到
最佳解决办法: 放弃JAVA转向C#,SUN已被ORACLE收购,已命存实亡!!!!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: