使用 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 版本。通过此新版本,您可以直接在 WEB-INF/lib 目录中使用“groovy-all”JAR,并立即开始使用 Groovy 编写应用程序,并在 Google 的基础架构上托管它们。

在本文的其余部分,我将引导您完成一些简单的步骤,让您构建第一个由 Groovy 驱动的 App Engine webapp。我将跳过基本的安装步骤,因为它们在 App Engine 文档中已经很好地概述和解释了,我将更多地关注构建 Groovy 应用程序本身的方面。正如您将看到的,这相当容易。

入门

首先,显然,您需要在 Google App Engine 上注册一个 Google 帐户,以便您可以在平台上创建应用程序,并能够将它们上传到云端。您还需要下载并安装 Google App Engine Java SDK。对于所有这些步骤,您应该查看在线文档,其中提供了您需要的所有详细信息。

安装 SDK 后,在本教程的过程中,您还应该下载安装 Groovy 1.6。您实际上只需要在本文的第一部分安装 Groovy,在那里我们需要编译 servlet,否则,在本文的其余部分,您将不再需要它,因为我们将使用由 Groovy 运行时本身编译的 Groovlet。

安装 Java、SDK 和 Groovy 后,我们可以继续并从这个Groovy 就绪型项目模板开始一个新项目。下载该框架,将其解压缩到您喜欢的目录中,让我们看看我们有什么!这就像打开圣诞礼物吗?

Google App Engine Groovy project structure

我已经将模板项目解压缩到名为 gaedemo 的目录中。在此目录的根目录下,您将看到一个 src 目录,其中将包含我们需要编译的所有 Groovy 和 Java 源代码(servlet、域类、实用程序类等)。deploy 目录基本上对应于我们的展开的 webapp:您将看到一个用于编译类的 classes 目录,用于各种 JAR(Groovy JAR 以及 Google App Engine 自身的 API JAR)的 lib,以及用于包含我们在本文第二部分中将开发的 Groovlet 的 groovy。您肯定也注意到了 appengine-web.xml 文件,这是一个 App Engine 特定的描述符。规范的 web.xml 文件也存在,用于定义您的 servlet、映射等等。

编译您的类

记住项目结构的概述后,让我们看看每个关键文件包含的内容。让我们从 build.groovy 文件开始。我没有创建 Ant 构建,而是利用了 Groovy 的AntBuilder,这是一个轻量级的 DSL/脚本包装器,位于 Ant 和 Ant 任务之上。
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 和已编译的类组成的类路径来调用它以编译我们的源代码。

为了调用该构建文件,如果您已安装 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...
如果您看到“成功”一词,那肯定是由于一切进展顺利,并且您的应用程序已准备就绪!从类似于此 URL 的 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的实例。它是一个用于创建任何类型的 XML 或 HTML 标记的小型实用程序 DSL。与其使用 println 语句以字符串形式输出原始 HTML,MarkupBuilder 提供了更简洁和更 Groovy 的语法。当然,您可以通过混合一些循环或条件等来使此标记尽可能动态。

重新上传应用程序后,您现在可以通过访问此 URL 来访问此 Groovlet:http://myowngroovy.appspot.com/hello.groovy。这次无需编译任何内容,因为这是 GroovyServlet 编译这些 Groovlet 脚本的工作。

这很容易,不是吗?

接下来是什么?

到目前为止,我们只触及了表面,但这足以开始使用 Groovy。正如您将在 Google App Engine API 中发现的那样,您可以从 Groovlet 和 servlet 利用一些有趣的服务:
  • 您可以使用的数据存储区 API 来存储您的对象,可以使用低级无模式 API 或 JDO。
  • 用于对图像进行各种转换和应用滤镜的图像 API。
  • 用于发送电子邮件的邮件 API。
  • 用于缓存昂贵的数据结构或计算结果的 memcache API。
  • 用于检索远程 URL 内容的 URL 获取器 API。
  • 用于使用 Google 用户帐户进行身份验证需求的用户 API。
当然,所有这些服务都可以从您的 Groovlet 脚本中使用。您还可以使用第三方库并将它们放入您的 WEB-INF/lib。进一步研究可用的 API 以查看在其之上是否可以进一步简化其使用方式,以更 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 大会,这是一个专门针对 Groovy、Grails 和 Griffon 的大会,演讲者是这些技术的专家或制造者,并设有动手实践课程。随着 Groovy 在 App Engine 中得到支持的公告,毫无疑问,我们也将在大会上讨论这个问题!

我们期待您对 App Engine 上 Groovy 的反馈,也非常乐意听取您关于如何进一步改进云端 Groovy 应用开发体验的任何建议。

获取 Spring 新闻通讯

关注 Spring 新闻通讯

订阅

领先一步

VMware 提供培训和认证,助您快速提升技能。

了解更多

获取支持

Tanzu Spring 通过简单的订阅提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部