Day 6:在 Java 虛擬機上使用 Grails 進行快速 Web 開發

在「30天學習30種新技術」的第六天,我決定去學習一個 web 開發框架 : Grailsphp

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

前期準備

  1. 一些基本的 Java 知識是須要的。
    2.在你的操做系統上安裝最新版本的 JDK,你能夠安裝 OpenJDK 或者 Oracle JDK 7。OpenShift 支持 OpenJDK 6 和 7.
  2. 從 Eclipse 官網下載和你操做系統對應的最新版 Eclipse 安裝包。在這篇文章寫的時候,最新版的 Eclipse 包叫 Kepler.
    請輸入圖片描述

安裝 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

第一步:安裝 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 條目有兩個屬性:emailfullName。咱們會爲 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

相關文章
相關標籤/搜索