在 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 社区中所有即将举行的活动。

查看全部