First they ignore you
then they ridicule you
then they fight you
then you win
    -- Mahatma Gandhi
Chinese => English     英文 => 中文             
随笔-219  评论-1047  文章-0  trackbacks-0

了解如何在 Oracle 数据库 XE 上快速构建一个 Grails 应用程序,然后将其部署到 Oracle 应用服务器 10g

2006 年 5 月发表

您可能已经注意到,Oracle 最近发表了一篇由 Richard Monson-Haefel 撰写的有关 Oracle 上的 Ruby on Rails 的文章。这篇文章介绍了 Ruby on Rails 框架以及如何使用它访问 Oracle 数据库(确切地说是 Oracle 数据库 10g 快捷版 (XE))。

如果您并不熟悉 Ruby on Rails,那么切记它与 Java 没有任何关系,它是一个基于 Ruby 的框架。Ruby on Rails 确实很吸引人、功能强大以及……但作为 Java 开发人员,我希望使用 Java(或等效语言)执行相同操作,从而利用我在 J2EE 中的投资。我还希望能够部署和管理使用 Oracle Enterprise Manager Application Server Control 等工具以这种方式开发的应用程序。

一种新框架的开发中已经利用了 Ruby on Rails 所遵循的“按照惯例进行编码”范例:Grails。Grails 将 Groovy 用作基础语言,因此它在 JVM 上运行并可以利用任何现有的 Java API。

如果您是 Java 开发人员,便会发现使用此框架加快 Web 应用程序的开发非常有意义。如果您不是 Java 开发人员但需要更快速地开发和部署 Web 应用程序,那么 Grails 也是一个很棒的工具。

在本文中,我将使用 Richard 在他撰写文章时使用的同一应用程序/数据库模式来开发我的第一个 Grails 应用程序。密切关注!

什么是 Groovy?什么是 Grails?

Groovy 是一种利用其他语言(如 Ruby、Jython 和 Smalltalk)中的特性的动态语言。Groovy 在 Java VM 上运行,并使任何现有的 Java 对象(以及所有 API)可用于 Groovy。Groovy 当前遵循 JSR-241 中的标准;您可以在 Groovy 网站及其项目主管 (Guillaume Laforge) 的网志中了解有关该语言的详细信息。

Grails 之于 Groovy 相当于 Ruby on Rails 之于 Ruby。(该名称最初为“Groovy On Rails”现在已改为“Grails”以避免混淆/竞争。)与 Ruby on Rails 一样,Grails 用于创建 CRUD创建、读取、更新、删除)Web 应用程序。您可以在 Grails 网站及其项目主管 (Graeme Rocher) 的网志中了解有关 Grail 的详细信息。

下面,我们将深入了解一下该示例应用程序。

示例:产品目录

第 1 步:设置 Oracle 数据库

如果您尚未设置 Richard 文章中的模式和表,则只需创建下列对象:

CREATE TABLE comics (
id NUMBER(10) NOT NULL,
title VARCHAR2(60),
issue NUMBER(4),
publisher VARCHAR2(60),
PRIMARY KEY (id)
);
CREATE SEQUENCE comics_seq;

我根据该文章在 ruby 模式中创建了该表。

第 2 步:安装 Grails

Grails 安装非常简单,安装指南中有述。基本步骤:

  • 下载二进制文件(我使用了 Grails 0.2
  • 设置不同的环境变量(GRAILS_HOME、JAVA_HOME、PATH),我使用了 Java 5。

完成!

第 3 步:创建 Web 应用程序

现在您已经安装了本产品,下一步是创建应用程序本身。

创建应用程序。create-app 命令使用模板(利用占位府表示应用程序的不同组件,如配置、MVC、库等)创建了完整的项目。在命令行界面中输入以下命令:

> grails create-app
....
.....
create-app:
[input] Enter application name:
comics_catalog
.....

您将看到,Grails 频繁使用 Ant。create-app 命令将请求您输入应用程序名称;例如,输入 comics_catalog。

创建的应用程序包含一个目录列表,从而使您可以使用 Groovy、Grails 以及其他 Web 组件开始构建该应用程序。

添加业务逻辑和模型:域类。Grails 和 Ruby on Rails 之间的最大差别之一是,使用前者,应用程序开发的主要组件不是表,而是域类。域类是业务应用程序的核心,它包含应用程序的状态和行为。

因此,下一步是为 comics 创建一个域类。为此,您只需转到项目的主目录(例如,cd comics_catalog)并运行 create-domain-class。

> cd comics_catalog
> grails create-domain-class
....
create-domain-class:
[input] Enter domain class name:
comics
....

当命令请求您输入类名时,请输入“comics”。Grails 使用的命名惯例与 Ruby on Rails 的不同,因此,您需要使用同一名称来命名类和要在其上映射对象的表。持久性层使用 GROM(Grails 对象关系映射)创建,后者利用了 JBoss Hibernate。

:在本示例中,我们利用了一个现有的数据库对象并基于它来创建域类。Grails 通常使用另一种方法(即所有内容由应用程序驱动)— 您首先创建域类,然后 Grails 将创建其他数据库对象。

Comics 类不包含任何有关映射本身的信息,因此您必须在该域类中创建不同的属性。您将在域类中开始使用 Groovy。域类位于以下位置:

./comics_catalog/grails-app/domain/Comics.groovy

请注意,默认情况下 Grails 使用两个属性创建该类:id 和 version。将它们保存到适当的位置,并添加标题、期号和出版商。

class Comics { 
@Property Long id
@Property Long version

// new properties for the Comics class
@Property String title
@Property Long issue
@Property String publisher

String toString() { "${this.class.name} :$id" }
}

现在,您已经设置了所有内容并准备运行 magic 命令,该命令将创建不同的屏幕和流。

从 domain 类中创建不同的屏幕。您现在可以运行 generate-all 命令来创建所有不同的屏幕。

> grails generate-all
....
input-domain-class:
[input] Enter domain class name:
comics
....

该命令将创建不同的视图和控制器;您可以查看各个目录:

./comics_catalog/grails-app/controllers
./comics_catalog/grails-app/views

配置数据库访问。接下来,您必须将该应用程序配置为使用 Oracle 数据库和模式。Grails 对数据源使用一个配置文件:

./comics_catalog/grails-app/conf/ApplicationDataSource.groovy

编辑该文件以连接到 Oracle 数据库。

class ApplicationDataSource {
@Property boolean pooled = true
@Property String dbCreate = "update" // one of 'create', 'create-drop','update'
@Property String url = "jdbc:oracle:thin:@localhost:1521:XE"
@Property String driverClassName = "oracle.jdbc.OracleDriver"
@Property String username = "ruby"
@Property String password = "ruby"
}

此处没有任何特殊内容,只有 URL、DriverClassName、username 和 password 等属性。一个值得注意的属性是 dbCreate,您可以使用它在模式上配置行为,以创建(或不创建)对象。本示例中存在表,因此需要重用对象 — 但首先您需要确认已经拥有所有必需对象(以及列),因此请选择更新。

下一个要执行的操作是将 Oracle JDBC 驱动程序添加到该应用程序以使其可用。为此,您只需将 JDBC 驱动程序复制到应用程序的 lib 目录中。在本示例中,我使用的是 Oracle 数据库 XE,因此我将文件从以下位置:

ORACLE_XE_HOME/app/oracle/product/10.2.0/server/jdbc/lib/ojdbc14.jar

复制到

./comics_catalog/lib/

第 4 步:运行应用程序

Grails 支持在独立模式下运行应用程序 (run-app)。该命令在部署应用程序后启动 Web 容器(基于 Jetty)。

> grails run-app 

:Jetty 将在端口 8080 上启动;要在其他端口(如 9090)上启动,请使用:

grails -Dserver.port=9090 run-app

您现在可以使用以下 URL 访问该应用程序:

http://localhost:8080/comics_catalog/comics/

您的浏览器将显示 Comics 表中的 comics 列表。


可以通过单击 New Comics 选项卡创建一个新条目,并通过单击 Show 链接查看/编辑/删除现有记录。


如您所见,创建应用程序其实非常简单。下一步是将应用程序部署到应用服务器。

第 5 步:部署应用程序

Grails 提供了一个用于将应用程序打包为要准备部署的 WAR 的命令,因此在项目的根目录中,您可以运行以下命令:

> grails war 

运行该命令时,您使用位于项目根目录中的应用程序名称(在本示例中为 comics_catalog.war)结束 WAR。

如果查看此 WAR,则将看到它非常大(超过 10MB),这是因为所有库均包含在该 Web 应用程序的 Lib 目录中。您可以在应用程序的 ./tmp (./comics_catalog/tmp/war) 目录中看到 WAR 的确切结构。

您可以将应用程序按原样部署到 Oracle 应用服务器 10g,但要避免类加载程序出现问题,应将该 Web 应用程序配置为先加载本地类。您可以在部署过程中使用类加载程序配置屏幕执行该操作:


还可以将此配置保存在部署计划中以方便稍后进行部署。

完成部署后,您可以使用 Oracle 应用服务器主机和端口(如下所示)访问该应用程序:

http://localhost:8888/comics_catalog/comics/list

您现在可以像管理和监视任何其他部署到 Oracle 应用程序 10g 的 J2EE 应用程序那样来管理和监视该应用程序。

请注意,其中有一些其他部署选项:

  • 我本人不喜欢将所有 JAR 文件都包含在 WAR 文件中,因此您可以改用 Oracle 应用服务器共享库上载和配置所有 JAR 来创建 Grails 库,而打包 WAR 时则将所有这些库排除在外。
  • 您还可以将 Hibernate/Spring 配置为使用标准定义数据源并使用 JNDI 名称查找连接。

结论

Grails 和 Ruby on Rails 确实都是很有吸引力的框架,它们使开发人员可以快速创建访问关系数据库(尤其是 Oracle 数据库)的 Web 应用程序。

Grails 刚推出不久(版本 0.2),但文档却很详细和完善。欢迎所有有兴趣的开发人员使用该框架,并向开发小组提供反馈。


Tug Grall 是 Oracle Application Server Containers for J2EE 小组的产品经理。

-------------------------------
山风小子注:
1,定义类属性时,@Property已经被Groovy废弃,请用关键字def代替;本例的@Property String title可写为String title,为何不写为def title,这是为了帮助Grails在利用Hibernate创建表时正确判断字段类型,是用VARCHAR呢还是DATETIME呢还是。。。呢?就是通过判断域类属性类型来完成的。
2,目前Grails的版本为0.4.2,1.0将于年中发布


-------------------------------
原文地址:http://www.oracle.com/technology/global/cn/pub/articles/grall-grails.html

附:Groovy轻松入门--Grails实战基础篇
posted on 2007-04-03 17:04 山风小子 阅读(1685) 评论(0)  编辑  收藏 所属分类: Groovy & Grails