在「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