用Groovy編寫Google App Engine應用
Google 剛剛宣稱(編者:此次更新時間為09年4月9日)他們的Google App Engine 云計算平臺現在已經支持了除了Python以外的其他的語言:即Java和Groovy!
現在,你可以通過Groovy高效的編寫你的Google App Engine 應用了。
幾星期以前,SpringSource Groovy團隊和Google App Engine Java 團隊緊密攜手,仔細的處理了大量的細節問題,以確保這門獲獎的頗為流行的基于JVM的動態語言--Groovy可以很好的運行在這個精彩的平臺上。他們針對那些限制嚴格以及有很強的安全管理政策的領域為Groovy編寫了一些補丁,之后在預定日期發布了 Groovy 1.6.1 更新。在新版本中,你可以通過直接在你的 WEB-INF/lib 目錄下部署 "groovy-all" JAR 文件開始通過 Groovy 編寫你的應用,并運行在 Google 的內核上。
在文本的其余部分,我將帶你通過一些簡單的步驟來創建你的***個基于Groovy的App Engine Web應用。由于他們在App Engine 的文檔里列的很清楚,這里我會跳過基本的安裝步驟,并且我將著重于構建Groovy 應用本身的方方面面。就像你即將看到的一樣,這會相當的輕松。
開始入門
首先,顯然,你得在 Google App Engine 上注冊一個Google帳號,以便你可以在該平臺創建應用,并能將其上載到云端。你也會需要下載并安裝Google App Engine Java SDK。上述所有的步驟,你應該參看在線文檔,你可以在里面找到所有你需要的細節。
一旦 SDK 安裝完畢,為了本次課程所需,你還應該下載并安裝 Groovy1.6。 本文前面的步驟需要我們用Groovy編譯一個servlet,你會用到 Groovy,但是在余下的部分,由于我們將使用Groovy在運行時自編譯的 Groovlets,所以你就不在需要它了。
有了 Java, SDK, Groovy 安裝,我們就可以繼續了,通過 Groovy-ready 項目模板建立一個新的項目。下載摘要,解壓到一個你喜歡的目錄下,下面讓我們看看里面都有什么!這感覺就像拆開圣誕禮物的包裝,對嗎?
我把這個模板項目解壓到了一個叫 gaedemo 的目錄下。在這個目錄的根,你會看到一個包含著所有我們的 Groovy 和 Java 源代碼需要去編譯的 src 目錄 (servlets, domain classes, utility classes, 等等)。 deploy 目錄基本上同我們將要輸出的webapp一致:你會看到一個包含所有編譯過的類的 classes 目錄, 存放各種 JAR 文件 lib 目錄(Groovy JAR 和 Google App Engine 自己的 API JAR 一樣), 以及存放 Groovlet 的 groovy 目錄。在本文的第二部分,我們將開發這些 Groovlets。 你也當然會注意到 appengine-web.xml 文件,它是一個 App Engine 特殊描述器。你可以能找到標準的 web.xml, 在它里面,你可以定義你自己的 servlets, 你的映射關系以及其它的東西。
編譯類
在對這個項目結構有個大概的印象之后,讓我們關鍵的文件都包括哪些.就讓我們從 build.groovy 文件開始把。我利用 Groovy 的 AntBuilder (構建在Ant之上的一個輕量級的領域特定語言) 替代了直接創建一個 Ant 編譯文件:
def ant = new AntBuilder().sequential { |
我們實例化一個 AntBuilder, 為目標目錄 WEB-INF 創建一個屬性,我們定義了 groovyc 的Ant任務,利用任務為 Groovy 代碼和指明了編譯器,這個編譯器(譯者:實際上就是 org.codehaus.groovy.ant.Groovyc ,這是個Java類,顯然它的作用就是把 Groovy 的代碼翻譯成Java代碼,剩下的事情就由 javac 來搞定了) 通過將編譯Java類的任務委托給 javac 編譯起而做到聯合編譯 Groovy 及其 Java 的依賴類 -- 當然,是否真能做到讓這兩種語言無縫集成,還有代證明。在定義完這個任務之后,將classpath設成 WEB-INF/lib 下面的JAR文件和編譯過的 classes,我們就可以啟動來編譯源代碼了。
為了執行這個 build 文件, 利用你已經安裝的 Groovy, 你只需要下面的命令去編譯你的項目
groovy build |
設置項目描述符
在 appengine-web.xml 文件中包含著一些Google App Engine 部署你項目時需要的原數據。尤其的,這里是你定義應用的名稱以及版本號的地方,你需要將你自己應用的名稱更新進去。到現在,我們的描述符看起來就像下面的樣子:
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> |
#p#
創建你***個 Servlet
在跳入 Groovlets 之前,我們將從一個不錯的老 Servlet 開始!由于Google App Engine 支持 Servlet 2.5 規范,我們可以些一個簡單的 "Hello World!" Servlet。 我們在 src 目錄創建一個名為 HelloServlet.groovy 的文件,它包含下面的代碼:
import javax.servlet.http.* class HelloServlet extends HttpServlet { |
雖然你會注意到 Groovy 提供的更簡單的語法: 少了分號, public 關鍵字, 屬性的 getter/setter 以及分號的省略都是可選的,但是這看起來更想一個普通 Java servlet。
下一步: 我們需要在 web.xml 引用這個 servlet,就像這樣:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> |
一旦 servlet 配置完畢,別忘了用我們的小 build 文件來編譯 servlet
groovy build |
把你的應用上載到云端
如果你的 Google App Engine SDK 配置正確,你應該可以在你的項目根目錄處運行下面的命令:
appcfg.sh update deploy/ |
***次運行時,這個命令會提示驗證你的權限,以后再調用的時候它將會打印類似下面的輸出:
Reading application configuration data...
Beginning server interaction for myowngroovy...
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
28% Cloning 5 application files.
40% Uploading 1 files.
52% Uploaded 1 files.
90% Deploying new version.
95% Will check again in 1 seconds
98% Closing update: new version is ready to start serving.
99% Uploading index definitions.
Update complete.
Success.
Cleaning up temporary files...
如果你看到了 “Success” 這個字, 那是當然的了,因為所有的事情進行十分順利,而你的應用也已經準備就緒了。 通過類似下面的 URL 來訪問這個 servlet (根據你應用的名字而所有不同): http://myowngroovy.appspot.com/hello,你將會看到這條消息:“Hello Google App Engine Groovy!”
求救于 Groovlets
利用 Groovy 語言編寫老 Java servlet 的確很讓人興奮,對嗎? 這種感覺就像你***次作出了一個servlet 一樣,對嗎?不是那么的一樣,它好像幾乎已經不那么時髦了。幸運的是, Groovy 以及 Groovlets 來了。
在極小的容器中, Groovlets 只不過就是存放在 WEB-INF/groovy 目錄下的 Groovy 腳本,Groovy servlet 調度器被用來(譯者:在運行時) 編譯和渲染這些腳本。
首先,讓我們更新 web.xml,增加一個 GroovyServlet, 以及一個 URL 映射,使得所有能被模式 *.groovy 匹配上的 URL 都會轉向它。
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> |
一點搞定這個,我們馬上就在 WEB-INF/groovy 下創建我們***個 Groovlet 腳本, hello.groovy:
html.html { |
這個 Groovy 腳本采用了一個名為 html 的變量名范圍(譯者:原文是 variable bound, 我估計是類似于 包路徑或者名稱空間的概念)來同 MarkupBuilder 的實例進行綁定。它(譯者:指 MarkupBuilder)是一個為了創建各種 XML 或 HTML 標記又小又有用的領域特定語言。 MarkupBuilder 用更清晰更 Groovy 的語法替代了依靠一行一行通過 println 語句輸出HTML字符串的形式。 當然,你可以通過混合一些循環和條件讓這個標記語言更加動態。
在重新上傳這個應用之后,你現在可以通過 http://myowngroovy.appspot.com/hello.groovy 來訪問這個 Groovlet 了。這次你就不需要編譯任何東西了,因為編譯這些 Groovlets 腳本是 GroovyServlet 的事情。
簡單嗎?
接下來...
我們僅僅是觸及了一些很膚淺的情況,但是這足以讓你對 Groovy 入門了。在你在 Google App Engine APIs 探索的同時,這里還有一些你可以通過你的 Groovlets 和 servlets 使用的破有意思的服務:
◆一個數據存儲的接口 (datastore API),你可以通過底層的無 schema 的API 或者 JDO 存儲你的對象
◆一個用來可以進行各種轉換和應用濾鏡圖像接口
◆一個用來發送電子郵件的郵件接口
◆一個用來緩存重量數據結構或者計算結果的內存緩沖接口(memcache API)
◆一個用來獲取遠端 URL 內容的 URL 獲取接口
◆一個使用 Google 用戶帳戶來進行驗證的用戶接口
當然,所有的這些服務都可以被你的 Groovlet 腳本調用。 你也可以使用第三方庫并把他們放在你的 WEB-INF/lib 目錄里面。研究一下更多的可用接口,看看在它們上面構建一個瘦 Groovy 層是否會讓它們更容易被使用,通過更Groovy的方式,這會很有趣。
如今, Groovlets 和普通的 servlet 被徹底的支持了,但是例如, Grails 應用還是不能跑在當前版本的 Google App Engine 上。我們將繼續和 Google App Engine 團隊一道努力,以便讓你可以通過 Grail 讓更多的高級應用(譯者:和Groovy)跑的一樣好。
【編輯推薦】