在 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 App Engine 雲託管平臺現在支援除 Python 之外的其他語言:即 Java 和 Groovy!

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

幾周前,SpringSource Groovy 團隊和 Google App Engine Java 團隊攜手合作,解決細節問題,以確保廣受歡迎且屢獲殊榮的 Groovy JVM 動態語言能夠在此激動人心的平臺上良好執行。在共同為 Groovy 在受限和嚴格安全管理器策略領域建立了一些補丁後,Groovy 開發團隊整合了這些補丁,併為 D 日釋出了更新的 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 後,在本教程的過程中,您還應該下載安裝 Groovy 1.6。您只需要在本文的第一部分安裝 Groovy,我們需要編譯一個 servlet;否則,在本文的其餘部分,您將不再需要它,因為我們將使用由 Groovy 執行時本身編譯的 Groovlets。

安裝 Java、SDK 和 Groovy 後,我們可以進一步操作,並從此Groovy 就緒專案模板中開始一個新專案。下載該骨架,將其解壓縮到您喜歡的目錄中,然後讓我們看看我們有什麼!這就像開啟一個聖誕禮物嗎?

Google App Engine Groovy project structure

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

編譯您的類

考慮到專案結構的概覽,讓我們看看每個關鍵檔案都包含什麼。讓我們從 build.groovy 檔案開始。我沒有建立 Ant 構建,而是利用了 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 聯合編譯器,能夠透過將 Java 類的編譯委託給 javac 編譯器,一起編譯 Groovy 和 Java 相互依賴的類——這是兩種語言之間無縫互操作性的又一個證明。在該任務定義之後,我們可以呼叫它來編譯我們的原始碼,使用 WEB-INF/lib 中的 JAR 和已編譯類組成的 classpath。

要呼叫該構建檔案,前提是您已安裝 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

在深入研究 Groovlets 之前,我們將從一個老式的 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 關鍵字,用於 getters/setters 的屬性表示法,以及省略分號。

下一步:我們需要在 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!”訊息!

Groovlets 來救場了!

用 Groovy 語言編寫普通的舊式 Java servlets,這很令人興奮,對吧?感覺就像你寫並使第一個 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">
    <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 的一個例項。它是一個用於建立任何型別的 XML 或 HTML 標記的小型實用 DSL。MarkupBuilder 提供了一種更簡潔、更 Groovy 的語法,而不是使用 println 語句以字串形式輸出原始 HTML。當然,您可以透過混入一些迴圈或條件等來使這種標記更加動態。

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

這不是很簡單嗎?

下一步是什麼?

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

目前,Groovlets 和普通 servlets 完全受支援,但例如,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 的會議,屆時將有這些技術的專家或開發者作為演講者,並有實踐操作環節。隨著 App Engine 支援 Groovy 的宣佈,毫無疑問我們也會在會議上討論這一點!

我們期待閱讀您關於 Groovy 在 App Engine 上的反饋,並且我們很樂意聽取您關於如何進一步改善在雲端開發 Groovy 應用程式體驗的所有建議。

訂閱 Spring 新聞通訊

保持與 Spring 新聞通訊的聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 透過一項簡單的訂閱提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部