在30天学习30种技术的第六天,我决定学习Grails Web应用开发框架.
Grails是基于Groovy和Java的开源Web开发框架。是对流行的Rails或者Django Web框架的JVM(Java虚拟机)响应,帮助开发者应对标准Jetty或者Tomcat服务器快速巧妙开发应用。这篇博客里,我们会讲到用Grails Eclipse插件创建简单的Web应用。
考虑学习Grails的两个原因:
安装Eclipse很简单,下载安装包后解压就好,在Linux或者Mac上,打开命令器,运行以下命令:
$ tar -xzvf eclipse-jee-kepler-R-*.tar.gz
Windows上用Winzip或者7-zip解压,解压后,你会有一个eclipse文件夹,可以为可执行文件建个快捷方式。
请参考Grails的入门指南。
我们这里用的Grails版本是2.3.1. 运行grails -version 来检查版本号。
$ 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路径,你可能发现另外一个安装版本。我之前可能无意间用brew 安装了Grails, 现在先卸载掉。
brew uninstall grails
为Java EE解压Eclipse Kpler IDE后,打开Eclipse,找到项目位置。打开Help>Eclipse Marketplace, 然后搜索Grails.安装 "Groovy/Grails Tool Suite(GGTS) for Eclipse Kepler(4.3)". 安装完后重启Eclipse.
这里我们建一个简单的链接分享应用。用户可以先注册然后提交链接。
新建Grails 项目步骤File>New>Grails Project,输入详细信息,命名为linkbin.
第一次创建Grails项目需要配置安装信息,点击"Configure Grails Installations" 然后添加新的安装。
也可以给项目指定不同路径,点击"Finish" 按钮。
Eclipse会问你是否要打开"Grails perspective", 点击 Yes. 项目就创建好并导入到Eclipse了。
程序的领域模型非常简单。两个实体:User和Story.
User包含两块:email和fullName. 我们在Email上添加了not blank, email和unique约束。email约束确保邮件格式验证。fullName有not blank和size约束。size约束是用groovy Range 限制集合,数字,或者字符长度的大小。要新建domain类,右击domain,选择New>Domain Class.
创建User 域类,用以下代码替换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 和用户要提交的Web url相关。 Description 和 submittedOn是link 和提交日期的补充文本。我们为link 和escription添加了not blank约束,unique和url约束也加到了link里。
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从域类生成控制器和视图很简单。要为User域类生成控制器和视图,打开"Grails Command Wizard ".
它会在能看到所有Grails 命令的地方打开命令窗口,用generate-all命令生成控制器和视图。
然后它会要求输入域类的名字,输入 linkbin.User 然后点击"Finish"按钮。
同样的,给Story域类生成控制器和视图。
Generate-all命令为所有实体生成CRUD控制器和视图。
所有的Grails项目都嵌入到支持运行嵌入式的tomcat服务器上。在本地运行程序,右击,选择"Run as grails app".
这回启动一个嵌入式tomcat servlet容器,可以在控制台看到以下日志。
| 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或者PHP, 你应该看看OpenShift. OpenShift作为公共平台服务,你可以在上面免费发布应用。
在OpenShift上发布应用之前,先做以下步骤:
sudo gem install rhc
要更新rhc,输入
sudo gem update rhc
想了解rhc command-line 工具,更多帮助参考https://openshift.redhat.com/community/developers/rhc-client-tools-install。
OpenShift也有eclipse插件,只是这里我们用OpenShift rhc命令工具。
安装之后,我们可以运行以下命令来创建程序。
$ rhc create-app linkbin tomcat-7 postgresql-9.2
这会创建一个程序容器,叫gear,安装所需的SELinux策略和cgroup配置。OpenShift也会为你安装一个私有的git仓库,并克隆到本地。最后,OpenShift会把DNS 扩散到网络中。程序可访问http://linkbin-domain-name.rhcloud.com/.替换你自己唯一的OpenShift域名(有时也叫命名空间)。
我们要发布WAR文件,所以需要把OpenShift上默认的文件删除。
$ git rm -rf src/ pom.xml $ git commit -am "deleted default source code"
到Eclipse, 用postgresql更换datasource配置。 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 命令,它会要求输入文件名,取名target/ROOT.war,会在目标文件夹生成 ROOT.war,复制ROOT.war到你的OpenShift linkbin程序的webapps文件夹。
现在添加war到git仓库,发布。
$ git add . $ git commit -am "linkbin app deployed to cloud" $ git push
代码发布后WAR就成功部署了,可以在http://linkbin-{domain-name}.rhcloud.com看到程序。
作为程序结果演示,可以到http://linkbin-shekhargulati.rhcloud.com.
这是今天的内容. 希望对你有用,继续给意见和建议吧。
原文:https://www.openshift.com/blogs/day-6-rapid-web-development-on-the-jvm-with-grails