以 Groovy 語言編寫您的 Google App Engine 應用程式

工程 | Guillaume Laforge | 2009年4月8日 | ...

[caption id="attachment_1577" align="alignright" width="250" caption="Google App Engine Groovy"]Google App Engine Groovy[/caption]

Google 剛剛宣布,他們的 Google App Engine 雲端託管平台現在支援 Python 以外的其他語言:即 Java 和 Groovy!

您現在可以有效地以 Groovy 語言編寫您的 Google App Engine 應用程式

幾個星期前,SpringSource Groovy 團隊和 Google App Engine Java 團隊攜手合作,共同解決細節問題,以確保適用於 JVM 的熱門且獲獎的 Groovy 動態語言能夠在這個令人興奮的平台上良好運行。在共同為 Groovy 創建了一些關於受限和嚴格安全管理器策略的修補程式後,Groovy 開發團隊整合了這些修補程式,並發布了更新的 Groovy 1.6.1 版本,以迎接 D-Day。透過這個新版本,您可以直接在您的 WEB-INF/lib 目錄中使用 "groovy-all" JAR,並立即開始以 Groovy 編寫您的應用程式,並將它們託管在 Google 的基礎架構上。

在本文的其餘部分,我將逐步引導您完成一些簡單的步驟,讓您構建您的第一個 Groovy 驅動的 App Engine 網路應用程式。我將跳過基本的安裝步驟,因為這些步驟在 App Engine 文件中已經很好地概述和解釋了,我將更多地關注構建 Groovy 應用程式本身的方面。您將會看到,這非常容易。

開始使用

首先,顯然,您需要先在 Google App Engine 上註冊一個 Google 帳戶,以便您可以在該平台上創建應用程式,並能夠將它們上傳到雲端。您還需要下載並安裝 Google App Engine Java SDK。對於所有這些步驟,您應該查看線上文件,其中提供了您需要的所有詳細資訊。

一旦 SDK 安裝完成,在本教學課程中,您還應該下載安裝 Groovy 1.6。您只需要安裝 Groovy 來完成本文的第一部分,在第一部分中,我們需要編譯一個 servlet,否則,對於本文的其餘部分,您將不再需要它,因為我們將使用 Groovlet,它們是由 Groovy 運行時本身編譯的。

在安裝了 Java、SDK 和 Groovy 之後,我們可以繼續下一步,並從這個Groovy-ready 專案範本中啟動一個新專案。下載該骨架,將其解壓縮到您喜歡的目錄中,讓我們看看我們擁有的東西!這就像打開聖誕禮物嗎?

Google App Engine Groovy project structure

我已將範本專案解壓縮到一個名為 gaedemo 的目錄中。在這個目錄的根目錄下,您將看到一個 src 目錄,其中將包含我們所有需要編譯的 Groovy 和 Java 原始碼(servlet、網域類別、工具類別等)。deploy 目錄基本上對應於我們展開的網路應用程式:您將看到一個 classes 目錄用於編譯後的類別,lib 用於各種 JAR(Groovy JAR 以及 Google App Engine 自己的 API JAR),以及 groovy 用於包含我們將在本文第二部分中開發的 Groovlet。您也一定注意到了 appengine-web.xml 檔案,這是一個 App Engine 特定的描述符。規範的 web.xml 檔案也存在,用於定義您的 servlet、您的映射等等。

編譯您的類別

了解了專案結構的概觀後,讓我們看看每個關鍵檔案都包含什麼。讓我們從 build.groovy 檔案開始。我沒有創建 Ant build,而是利用了 Groovy 的 AntBuilder,這是一個基於 Ant 和 Ant 任務的輕量級 DSL / 腳本包裝器
def ant = new AntBuilder().sequential {
    webinf = "deploy/WEB-INF"
    taskdef name: "groovyc", classname: "org.codehaus.groovy.ant.Groovyc"
    groovyc srcdir: "src", destdir: "${webinf}/classes", {
        classpath {
            fileset dir: "${webinf}/lib", {
                include name: "*.jar"
            }
            pathelement path: "${webinf}/classes"
        }
        javac source: "1.5", target: "1.5", debug: "on"
    }
}
我們實例化 AntBuilder,為目標 WEB-INF 目錄創建一個屬性,我們定義了 groovyc Ant 任務,它是 Groovy Joint Compiler,能夠將 Groovy 和 Java 相互依賴的類別一起編譯,方法是將 Java 類別的編譯委託給 javac 編譯器 — 這再次證明了兩種語言之間無縫的互操作性。在定義了該任務之後,我們可以調用它來編譯我們的原始碼,使用由 WEB-INF/lib 中的 JAR 和編譯後的類別組成的類別路徑。

為了調用該構建檔案,假設您已安裝 Groovy,您只需使用以下命令來編譯您的專案

groovy build

設定專案描述符

appengine-web.xml 檔案包含 Google App Engine 部署您的應用程式所需的一些元數據。特別是,您將在此處定義應用程式的名稱或其版本號。您需要更新該檔案以使用您自己的應用程式名稱。到目前為止,我們的描述符如下所示
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>myowngroovy</application>
    <version>1</version>
</appengine-web-app>

創建您的第一個 servlet

在深入 Groovlet 之前,我們先從一個好的舊 Servlet 開始!由於 Google App Engine 支援 Servlet 2.5 規範,我們可以編寫一個簡單的 Hello World! servlet。我們在 src 目錄中創建一個名為 HelloServlet.groovy 的檔案,其中將包含以下程式碼
import javax.servlet.http.*

class HelloServlet extends HttpServlet {     void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {         resp.contentType = "text/plain"         resp.writer.println "Hello Google App Engine Groovy!" } }

這看起來很像一個普通的 Java servlet,儘管您會注意到 Groovy 提供的更簡單的語法:缺少分號、可選的 public 關鍵字、用於 getter/setter 的屬性表示法、省略分號。

下一步:我們需要在 web.xml 中引用該 servlet,如下所示

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

一旦 servlet 配置完成,我們不應忘記使用我們的小型構建檔案來編譯 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!” 訊息!

Groovlet 來救援!

好吧,用 Groovy 語言編寫普通的舊 Java servlet 很令人興奮,對吧?感覺就像您第一次編寫並讓您的第一個 servlet 正常工作的那天?似乎沒有那麼令人興奮,它似乎已經過時了。幸運的是,Groovy 用它的 Groovlet 來救援了!

簡而言之,Groovlet 只是儲存在 WEB-INF/groovy 中的 Groovy 腳本,它們由 Groovy servlet 調度器呈現,該調度器編譯並呈現這些腳本。

首先,讓我們更新我們的 web.xml 以將 GroovyServlet 添加到組合中,並為所有遵循 *.groovy 模式的 URL 添加 URL 映射以重定向到它

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>GroovyServlet</servlet-name>
        <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GroovyServlet</servlet-name>
        <url-pattern>*.groovy</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

完成此操作後,我們在 WEB-INF/groovy 下創建我們的第一個 Groovlet 腳本,並將其命名為 hello.groovy

html.html {
    head {
        title "Hello"
    }
    body {
        p "Hello Groovy World!"
    }
}

這個 Groovy 腳本使用一個 html 變數,該變數綁定到腳本的綁定,它是 MarkupBuilder 的實例。它是一個小型實用程式 DSL,用於創建任何類型的 XML 或 HTML 標記。MarkupBuilder 沒有以字串形式輸出原始 HTML 與 println 語句,而是提供了更簡潔和更 Groovy 的語法。當然,您可以通過混合一些循環或條件語句等,使此標記盡可能動態。

重新上傳應用程式後,您現在可以通過訪問 URL http://myowngroovy.appspot.com/hello.groovy 來訪問這個 Groovlet。這次無需編譯任何東西,因為編譯這些 Groovlet 腳本是 GroovyServlet 的工作。

這不是很簡單嗎?

下一步是什麼?

到目前為止,我們只觸及了表面,但這足以開始使用 Groovy。正如您將在 Google App Engine API 中發現的那樣,您可以從您的 Groovlet 和 servlet 中利用一些有趣的服務
  • 一個資料儲存 API,您可以使用它來儲存您的物件,可以透過低階的無綱要 API,也可以透過 JDO
  • 一個圖像 API,用於對圖像進行各種轉換並應用濾鏡
  • 一個郵件 API,用於發送電子郵件
  • 一個 memcache API,用於緩存昂貴的數據結構或計算結果
  • 一個 URL fetcher API,用於檢索遠端 URL 內容
  • 一個使用者 API,用於您的身份驗證需求,使用 Google 的使用者帳戶
當然,所有這些服務都可以從您的 Groovlet 腳本中使用。您也可以使用第三方函式庫並將它們放在您的 WEB-INF/lib 中。進一步研究可用的 API 以查看是否可以在它們之上添加一個薄的 Groovy 層,甚至可以以更 Groovy 的方式簡化它們的使用,這將是很有趣的。

目前,完全支援 Groovlet 和普通 servlet,但是,例如,Grails 應用程式在當前版本的 Google App Engine 上無法運作。我們將繼續與 Google App Engine 團隊合作,以便您也可以使用 Grails 來開發更複雜的應用程式。

GR8 Conference dedicated to Groovy, Grails and Griffon

如果您想了解更多關於 Groovy 和 Grails 的資訊,以及如何編寫 Groovy 驅動的 App Engine 應用程式,您也可以考慮註冊並參加 GR8 Conference,這是一個專注於 Groovy、Grails 和 Griffon 的會議,由這些技術的專家或製造商擔任演講者,並提供動手實作的實務課程。隨著 Google App Engine 支援 Groovy 的公告,毫無疑問我們也將在會議上談論這一點!

我們期待閱讀您對 Groovy on App Engine 的回饋,並且我們很樂意聽到您可能提出的所有關於我們如何進一步改進在雲端開發 Groovy 應用程式體驗的建議。

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

搶先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部