在“30天学习30种新技术”的第六天,我决定去学习一个 web 开发框架 : Grails。php
Grails 是一个基于 Groovy 和 Java 的开源 Web 框架。它是 Java 虚拟机(JVM)上顺应 Rails、Django 等流行 Web 框架而生的,伴随着标准的 Jetty/Tomcat 服务器,Grails 能帮助开发者进行快速的应用开发。在这篇文章中,咱们会描述如何用 Grails 的 Eclipse 插件开发一个简单的 Web 应用。html
为何咱们选择 Grails?
这是考虑到两个缘由:
1. 快速的 Web 开发:它在 Java 虚拟机和掌握的 Java 知识下,也能达到像 Rails 或 Django 那样的快速开发的目标。
2. 成熟的技术:Grails 是基于 Spring 和 Hibernate 打造的。它能够看做是在这些技术上加了语法糖(Syntactic Sugar)。java
安装 Eclipse 很是容易。只须要解压你下载的安装包就能够了。在 linux 或者 Mac 系统上,打开终端,而后输入:linux
$ tar -xzvf eclipse-jee-kepler-R-*.tar.gzgit
在 Wdinows 系统上,你能够用 winzip 或者 7-zip 或者其它解压软件来解压。解压以后,在文件夹里面应该能能看到一个名为 eclipse 的文件夹。你能够按本身意愿为运行程序文件建立一个快捷方式。web
安装 Grails:
请参阅 Grails 的开始使用指引.sql
如今这篇文章使用的 Grails 版本为 2.3.1。 在命令行下运行 grails -version 能查看你当前的 Grails 版本:数据库
$ grails -version
Grails version: 2.3.1segmentfault
当我第一次运行查看版本的命令时,我获得是如下的报错:api
$ 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
当你解压了和 Java EE 对应的 Eclipse Kepler IDE 以后,打开 Eclipse,而后从导航转到 项目的工做空间(Project Workspace)。打开菜单的 Help > Eclipse Marketplace,而后搜索 Grails。安装"Eclipse Kepler(4.3)的 Groovy/Grails 工具套件"。插件安装以后重启 Eclipse。
在这篇文章中,咱们的目标是编写一个简单的连接分享应用。用户能够首先注册应用,而后本身提交连接。
建立一个新项目:文件 > 新建 > Grails 项目,而后完善项目信息。这个应用的名字是 Linkbin。
当咱们第一次建立 Grails 项目时,咱们必须配置 Grails 的安装环境。点开"Grails 安装配置(Configure Grails Installations)",而后增长一个新的 Grails 安装。
像在下图那样,咱们能够本身为项目设置一个不一样的存放路径。而后完成后,点击"完成(Finish)"按钮。
Eclipse 会问咱们是否须要打开"Grails 视角(Grails perspective)",选择"是"。项目就会被建立,而后被导入到 Eclipse 里面。
应用的领域模块很是简单,咱们须要两个条目:User 和 Story。
User 条目有两个属性:email
和 fullName
。咱们会为 email 属性增长 not blank
、email
、unique
限制。email 限制能把这个属性的内容检测限定为 email 格式。fullName 属性有 not blank
和size
两个限制。其中,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