简介:富 Internet 应用程序(Rich Internet Applications,RIA)通过浏览器保证桌面应用程序 的动态性和功能。RIA 的主要特征之一就是将表示层移动到客户机,并使用服务器上健壮的 RESTful 服 务层支持它。这种想法借助 SOUI(Service Oriented User Interface)和 SOFEA(Service Oriented Front End Architecture)之类的热门词汇得到传播。
关于本系列
这个系列探索一些应 用程序架构,它们在后端使用由 Grails 框架实现的面向服务架构(SOA)。了解 Grails 如何大大简化 了 Web 应用程序的创建,尤其是 Web 服务的创建。这种后端可以轻松连接到任意纯客户端应用程序。 在第 1 部分中,您将使用 Adobe Flex 创建一个可以使用 Flash Player 的应用程序。在第 2 部分中 ,您将通过 Google Web Toolkit 用纯 JavaScript 创建前端。
先决条件
在这篇文章中 ,您将使用 Grails 和 Flex 构建 Web 应用程序。Grails 框架基于 Groovy 编程语言,这是针对 Java 平台的动态语言。熟悉 Groovy 会更好,但不是必要的。了解 Java 或其他动态语言(比 如 Ruby 或 Python)会有很大帮助。本文使用 Grails 1.0.3。 Grails 可用于许多数据库或应用服务 器,但本文不需要提供它们,因为它们已经随 Grails 附带。前端使用 Flex 构建。Flex 是一个使用 ActionScript 编程语言的应用程序框架,它在 Flash Player 上运行。再声明一下,不熟悉 Flex 和 ActionScript 没有关系。熟悉 Java 和 JavaScript 有利于学习 Flex。需要 Flex SDK 3.2 或更高版 本来编译本文的代码。要运行本文构建的应用程序,必须具有 Flash Player 10.0 或更高版本。
架构
许多企业都争相采用 Service Oriented Architecture (SOA)。SOA 让架构更加敏捷,方便业务的快 速发展。当然,您的企业可能有另一个紧迫的计划:将用户界面实现为现代的富 Internet 应用程序。 SOA 和 RIA 这两种流行的技术并不容易结合在一起。但事实证明,它们可以很好地协同工作。您可以使 用 SOA 设计将服务部署到应用服务器。也可以将所有表示逻辑移动到客户机,并利用强大的前端技术( 比如 Flex)创建 RIA。这正是您在本系列中需要完成的事情,现在从使用 Grails 创建一个 Web 服务 开始。
Web 服务
当许多开发人员听见术语 Web 服务 时,他们就会想到 SOAP(Simple Object Access Protocol)。 SOAP 在很多开发人员脑中具有消极的意义,因为他们认为 SOAP 是一种大型的复杂技术。不过 Web 服 务不是这样的。REST(Representational State Transfer)式的 Web 服务受到普遍欢迎,因为它们的 语义很简单。它们的创建和使用都很容易。它们可以像 SOAP 一样使用 XML,但使用的是 Plain Old XML(POX),不像 SOAP 那样带有奇特的包装器和报头。Grails 框架使得创建这种 Web 服务非常简单 ,所以我们现在从 Grails 领域模型开始。
Grails 域模型
Grails 是通用的 Web 开发框架。许多 Web 应用程序都使用关系数据库存储和获取在某个应用程序 中使用的数据,因此 Grails 采用了强大的 Object Relational Modeling (ORM) 技术,即 GORM。通过 GORM,您可以轻松地对域对象进行建模,并将它们持久化到任意关系数据库中,但不再需要处理 SQL。 GORM 使用流行的 Hibernate 库生成特定于数据库的经过优化的 SQL,以及管理域对象的生命周期。在 使用 GORM 之前,我们先快速讨论一下将要创建的应用程序,以及需要使用 GORM 进行建模的东西。
在示例应用程序中,您将创建一个模仿流行站点 Digg 的功能的 Web 应用程序。在 Digg 上,用户 可以提交新闻链接(Web 页面)。然后其他用户可以阅读这些新闻,并投票支持或反对它们。您的应用 程序将具有这些基本功能。它允许人们匿名地提交新闻并对其进行投票,因此不需要对用户进行建模, 对新闻建模即可。下面是针对示例应用程序中的新闻的 GORM 模型,如清单 1 所示。
清单 1. 新闻模型
class Story {
String link
String title
String description
String tags
String category
int votesFor
int votesAgainst
}
这就是对域对象进行建模所需的所有代码。您要声明它的属性和这些属性的类型。这将允许 Grails 为您创建表,并且为从该表读写数据动态创建方法。这是 Grails 提供的主要好处之一。您仅需将数据 建模代码放在某个地方,而不需要为简单的读写编写任何模板代码。现在已经准备好域模型,您可以创 建一些使用该域模型的业务服务了。