Ruby on Rails和J2EE:两者能否共存

日期: 2007-12-03 作者:Aaron Rustad 来源:TechTarget中国

  Ruby on Rails 是一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上。它被宣传为现有企业框架的一个替代,而它的目标,简而言之,就是让生活,至少是 Web 开发方面的生活,变得更轻松。在本文中,Aaron Rustad 将对 Rails 和传统的 J2EE 框架在架构上的一些关键特性进行比较。

  Ruby on Rails 是一个 Web 应用程序框架,它的目标是为应用程序开发提供一条易行道。实际上,框架的支持者们声称 Ruby on Rails 开发人员的生产率最多是使用传统 J2EE 框架的 10 倍。虽然这句话造成了 Rails 和 J2EE 社区相当大的争议,但争论中却很少谈及如何比较 Rails 和 J2EE 架构。本文将使用企业应用程序中常见的开源工具,对 Rails 框架和典型的 J2EE 实现进行比较。

  什么是 Ruby on Rails?

  要想找到用一句话描述Rails 的简单说明,只需查看项目的主页即可:

  Rails 是一个用 Ruby 编写的全栈的(full-stack)、开源的 Web 框架,可以使用它来轻松编写实际的应用程序,所需的代码也要比大多数框架花在处理 XML 上的代码少。

  虽然我不能保证框架确实会提供它所承诺的轻松快乐,但是上面这句话确实很好地总结了 Rails 的品质。全栈包括:Web 服务器、处理 HTTP 请求和响应的框架,以及方便地把数据持久存储到关系数据库的框架。Rails 通过消除复杂的 XML 配置文件,使用 Ruby 语言的动态性质,帮助把静态类型语言中常见的许多重复代码减少到最少,努力使开发工作变得更容易。

  Rails 和典型的 J2EE Web 堆栈

  图 1 比较了 Rails 堆栈和典型的 J2EE Web 堆栈(包括 Tomcat servlet 容器、Struts Web 应用程序框架和 Hibernate 持久性框架)。

  图 1. Rails 和 J2EE 堆栈的比较

  可以看到,Rails 堆栈和构成普通的基于 J2EE 的 Web 应用程序的组件之间的基本区别很小。两者都有用来执行应用程序代码的容器;都有帮助分离应用程序的模型、视图和控件的 MVC 框架;以及持久存储数据的机制。

  前端控制器

  Struts 的 ActionServlet 和 Rails 的 DispatchServlet 都是前端控制器模式的例子;所以,它们提供了相同的功能。它们接受 HTTP 请求,解析 URL,把请求的处理转发给适当的动作。在 Struts 中,动作是扩展自 Action 的类;对于 Rails,动作是扩展自 ActionController 的类。两个前端控制器之间的主要区别是它们如何决定处理具体请求的动作。

  使用 Struts,开发人员需要把特定请求的映射外部化到 XML 配置文件中的 Action 类。当首次装入 ActionServlet 时,它将解析这个文件,并准备接受请求。根据约定,以 .do 结束的请求被重定向到 ActionServlet,由 ActionServlet 分派到适当的 Action。图 2 的 XML 是一个典型的映射。它告诉 ActionServlet 把叫作 deleteOrder.do 的请求转发到 controllers.order.DeleteOrderAction 作进一步处理。

  Rails 采用了不同的方式。它没有依赖配置文件把请求映射到某一个动作,而是根据请求的 URL 发现适当的动作。从图 2 可以看到,URL http://localhost/order/delete/4 告诉 Rails 调用 OrderController 实例上的 delete 方法,并将 4 作为可用的实例变量。Rails 足够聪明,知道 /order 将映射到文件 order_controller.rb 中定义的一个控制器类。如果在控制器中定义了 find 方法,那么只要用 find 替代 URL 中的 delete,就可以调用这个方法。

  图 2. Rails 和 Struts 中的 URL 映射

  动作和模型

  在 Rails 和 Struts 中,动作用来充当前端控制器和模型之间的桥梁。开发人员提供动作的现实,从而提供特定于应用程序的请求处理。前端控制器负责接受请求,并把请求传递到特定动作。图 3 演示了 Rails 和 Struts 基本的动作层次结构。

  图 3. Rails 和 Struts 的动作层次结构

  Struts 要求开发人员扩展 Action 并覆盖 execute(),以处理请求。通常,每个 Action 类都提供了非常具体的工作单元。图 3 演示了三个特定动作:SaveOrderAction、DeleteOrderAction 和 ListOrdersAction。前端控制器将调用 execute() 方法,传递给它许多有用的对象,其中包括 HTTP 请求和响应对象。ActionForm 是一个类,它可以方便地向视图来回传输并验证与表单有关的输入,ActionMapping 包含映射的配置信息,就像 图 2 的 XML 所描述的那样。

……

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐