Day 6:在 Java 虚拟机上使用 Grails 进行快速 Web 开发

Grails 是一个基于 Groovy 和 Java 的开源 Web 框架。它是 Java 虚拟机(JVM)上顺应 Rails、Django 等流行 Web 框架而生的,伴随着标准的 Jetty/Tomcat 服务器,Grails 能帮助开发者进行快速的应用开发。在这篇文章中,我们会描述如何用 Grails 的 Eclipse 插件开发一个简单的 Web 应用。

为什么我们选择 Grails?

这是考虑到两个原因:

  1. 快速的 Web 开发:它在 Java 虚拟机和掌握的 Java 知识下,也能达到像 Rails 或 Django 那样的快速开发的目标。
  2. 成熟的技术:Grails 是基于 Spring 和 Hibernate 打造的。

前期准备

  1. 一些基本的 Java 知识是需要的。
  2. 在你的操作系统上安装最新版本的 JDK,你可以安装 OpenJDK 或者 Oracle JDK 7。OpenShift 支持 OpenJDK 6 和 7.
  3. 从 Eclipse 官网下载和你操作系统对应的最新版 Eclipse 安装包。在这篇文章写的时候,最新版的 Eclipse 包叫 Kepler.
    请输入图片描述

安装 Eclipse 非常容易。只需要解压你下载的安装包就可以了。在 linux 或者 Mac 系统上,打开终端,然后输入:

$ tar -xzvf eclipse-jee-kepler-R-*.tar.gz

在 Wdinows 系统上,你可以用 winzip 或者 7-zip 或者其它解压软件来解压。解压之后,在文件夹里面应该能能看到一个名为 eclipse 的文件夹。你可以按自己意愿为运行程序文件创建一个快捷方式。

安装 Grails:
请参阅 Grails 的开始使用指引.

现在这篇文章使用的 Grails 版本为 2.3.1。 在命令行下运行 grails -version 能查看你当前的 Grails 版本:

$ grails -version
Grails version: 2.3.1

当我第一次运行查看版本的命令时,我得到是以下的报错:

$ grails -version
Exception in thread “main” java.lang.NoClassDefFoundError:
org/codehaus/groovy/grails/cli/support/GrailsStarter

这个错误的原因是我这个机子上 Grails 的版本太老了。如果用的是 mac,转到 /usr/local/bin 目录下,你或者找到另一个安装文件。我以前可能不记得我安装过 grails 了,所以我先把旧版卸载了:

brew uninstall grails

 

第一步:安装 Eclipse Grails 插件

当你解压了和 Java EE 对应的 Eclipse Kepler IDE 之后,打开 Eclipse,然后从导航转到 项目的工作空间(Project Workspace)。打开菜单的 Help > Eclipse Marketplace,然后搜索 Grails。安装”Eclipse Kepler(4.3)的 Groovy/Grails 工具套件”。插件安装之后重启 Eclipse。

第二步:创建一个新的 Grails 项目

在这篇文章中,我们的目标是编写一个简单的链接分享应用。用户可以首先注册应用,然后自己提交链接。

创建一个新项目:文件 > 新建 > Grails 项目,然后完善项目信息。这个应用的名字是 Linkbin。

当我们第一次创建 Grails 项目时,我们必须配置 Grails 的安装环境。点开”Grails 安装配置(Configure Grails Installations)”,然后增加一个新的 Grails 安装。

像在下图那样,我们可以自己为项目设置一个不同的存放路径。然后完成后,点击”完成(Finish)”按钮。
请输入图片描述

Eclipse 会问我们是否需要打开”Grails 视角(Grails perspective)”,选择”是”。项目就会被创建,然后被导入到 Eclipse 里面。

第三步:创建一个领域模型(Domain model)

应用的领域模块非常简单,我们需要两个条目:User 和 Story。
User 条目有两个属性:email 和 fullName。我们会为 email 属性增加 not blankemailunique 限制。email 限制能把这个属性的内容检测限定为 email 格式。fullName 属性有 not blanksize两个限制。其中,size 的量使用 groovy 的 range 来限定长度集合、数字或者内容长度等的大小。为了创建一个新的 domain 类,右击 domain,然后选择 New > Domain Class.

这会创建一个 User 领域类(domain class)。用下面的代码代替 User 领域类的代码:

package linkbin

class User {
    String email
    String fullName
    static constraints = {
        email unique:true , blank : false , email:true
        fullName size:5..100  , blank : false
    }
}

Story 条目也有三个属性:link,description,submittedOn. link 属性对应用户所提交的网址,description 和 submittedOn 是所提交网址的额外文字内容和提交日期。我们会为 link 和 description 属性加上 not blank(非空)限制。同样的,link 属性也会被加上 unique 和 url 限制。

package linkbin

class Story {
    String link
    String description
    Date submittedOn

    static constraints = {
        link url : true , blank : false ,unique : true 
        description size : 10..1000 , blank : false 
    }
}

现在,我们连接 User 和 Story 起来。 一个用户可以提交多个故事,每个故事都都有所属的用户。它们的关系如下所示:

package linkbin
class User {
    String email
    String fullName
    static hasMany = [stories : Story]
    static constraints = {
        email unique:true , blank : false , email:true
        fullName size:5..100  , blank : false
    }
    static mapping = {
        table 'users'
    }
}

一个故事属于一个用户:

package linkbin
class Story {
    String link
    String description
    Date submittedOn  
    static belongsTo = [user : User]
    static constraints = {
        link url : true , blank : false ,unique : true 
        description size : 10..1000 , blank : false 
    }
    static mapping = {
        table 'stories'
    }
}

第四步:从领域模型创建控制器和视图

在 Grails 上,要为领域模块产生控制器(controller)和视图(view)非常简单。为了为 User 的领域类产生控制器和视图,打开”Grails Command Wizard”.
请输入图片描述

它会在能看见所有 Grails 命令的地方打开命令向导(wizard)。我们会使用 generate-all 命令去产生控制器和视图。

下一步它会询问领域类的名字。输入 linkbin.User 然后,点击”完成”。

类似的,为 Story 领域类产生控制器和视图。

那个 Generate-all 命令会为这两个条目生成 CRUD 控制器和视图。

第五步:运行程序

每个 Grails 项目都自带连接了一个 tomcat 服务器。为了在本地上运行程序,右击项目,然后选择”运行 grails 应用”(Run as Grails app)。

这会启动内嵌的 tomcat 程序容器,然后我们能在控制台看到以下的日志:

| Loading Grails 2.3.1
| Configuring classpath.
| Environment set to development…..
| Packaging Grails application…..
| Running Grails application
| Server running. Browse to http://localhost:8080/linkbin

配置到云上

Grails 应用会被打包成 war 格式的文件。OpenShift 是一个开源的,公开的,可扩展的服务平台。如果你是一个 Java,Python,Node.js, Ruby 或者 php 开发者,你应该留意下 OpenShift 。在 OpenShift,你可以免费把你的程序部署字在上面。

在我们部署应用到 OpenShift 之前,我们要做先做这些事情:
1. 注册一个 OpenShift 账户。这是完全免费的,而且红帽(Red Hat)会给每个用户三个免费的 Gears,在 Gears 上你可以运行你的程序。在这篇文章写的时候,OpenShift 会为每个用户分配 1.5GB 的内存和 3GB 的硬盘空间。

2.在本机上,安装 rhc 客户端工具。rhc 是一个 ruby gem,所以你需要机子上安装好 ruby 1.8.7 及以上的 ruby。要安装 rhc,输入:

sudo gem install rhc

更新 rhc 到最新版本,执行:

sudo gem updatge rhc

如果需要阅读额外的安装 rhc 命令行工具时的帮助文件,可以浏览:https://openshift.redhat.com/community/developers/rhc-client-tools-install

3.使用 rhc setup 命令设置好 OpenShift 账户,这个命令会为你创建一个命名空间,然后上传你的 ssh keys 到 OpenShift 服务器上。

OpenShift 也有一个 Eclipse 插件,但这篇文章中,我会使用 rhc 命令行工具。

在设置好之后,运行下面命令创建 OpenShift 应用:

$ rhc create-app linkbin tomcat-7 postgresql-9.2

它会为我们创建一个应用容器,叫做 Gear,会自动设置好需要的 SELinux/cgroup 配置。OpenShift 也会为我们建立一个私密的 git 仓库,然后可克隆这个仓库到本地系统上。最后,OpenShift 还会部署一个连接外面的 DNS。部署的应用可以通过链接: http://linkbin-domain-name.rhcloud.com/ 来访问。把领域换成自己的 OpenShit 领域(有时候叫 命令空间)

由于我们要部署 war 文件,我们必须删除由 OpenShift 默认产生的资源文件。

$ git rm -rf src/ pom.xml
$ git commit -am “deleted default source code”

打开 Eclipse,用 postgresql 改变数据来源的配置。Grails 在 conf/Datasource.groovy 文件中维护所有的数据库配置。更新生产环境的配置以使用 PostgreSQL.

production {
    dataSource {
        dbCreate = "update"
        driverClassName = "org.postgresql.Driver"
        dialect = org.hibernate.dialect.PostgreSQLDialect   
    uri = new URI(System.env.OPENSHIFT_POSTGRESQL_DB_URL)
    url = "jdbc:postgresql://"+uri.host+uri.path+"/"+System.env.OPENSHIFT_APP_NAME
        username = System.env.OPENSHIFT_POSTGRESQL_DB_USERNAME
        password = System.env.OPENSHIFT_POSTGRESQL_DB_PASSWORD
    }
}

现在我们需要把 grails 应用打包成 war 文件。我们会使用 grails 的 war 命令来完成这个。打开 “Grails Command Wizard”, 使用 war 命令。它会询问一个名字作为 war 文件的名字,我们把文件设成:target/ROOT.war。 她会在目标文件中生出 ROOT.war 文件。复制 ROOT.war 到 OpenShift linkbin 应用的 webapps 文件夹中。

现在,把 war 文件也加入到你的 git 仓库中,然后 push 改变的内容。

$ git add .
$ git commit -am "linkbin app deployed to cloud"
$ git push

当代码成功推送(push),而 war 也成功部署之后,我们可以访问:http://linkbin-{domain-name}.rhcloud.com 来看看程序运行的情况。

作为一个教训性质的 demo,项目的最终效果你可以在这里看到:http://linkbin-shekhargulati.rhcloud.com .

这就是今天的内容了。我希望这篇文章能帮到阅读这个系列的开发者们。随时欢迎反馈信息、

接下来


原文:Day 6: Rapid Web Development on the JVM with Grails
翻译:Segmentfault

发表评论