用Groovy编写Google App Engine应用

开发 开发工具
随着Google App Engine添加了JVM功能,基于JVM的各种语言编写的应用现在都可以在Google的云端运行。本文简单介绍了如何使用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 {
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 代码和指明了编译器,这个编译器(译者:实际上就是 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">
<application>myowngroovy</application>
<version>1</version>
</appengine-web-app>

#p#

创建你***个 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!"
}
}

虽然你会注意到 Groovy 提供的更简单的语法: 少了分号, public 关键字, 属性的 getter/setter 以及分号的省略都是可选的,但是这看起来更想一个普通 Java servlet。

下一步: 我们需要在 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 配置完毕,别忘了用我们的小 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">
<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 的变量名范围(译者:原文是 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)跑的一样好。

【编辑推荐】

  1. Google宣布App Engine增加Java支持
  2. Google App Engine:坚定的站在Java的中心
  3. 使用Java开发Google APP Engine初试
责任编辑:yangsai 来源: 译言
相关推荐

2010-02-01 09:21:49

GroovyGoogle App Gaelyk

2012-08-01 14:12:45

IBMdW

2009-08-11 10:16:27

Google App GAE

2009-10-14 10:11:39

App Engine

2009-08-11 11:23:41

什么是GAEGoogle App

2009-04-13 15:48:54

Google AppJavaSun

2009-05-22 14:52:33

App Engine免费配额

2009-04-08 16:47:11

GoogleApp EngineJava

2011-09-06 14:53:01

Google App

2009-04-09 08:54:07

App EnginegoogleJava

2009-05-13 09:20:12

Google App 应用收费

2009-02-16 09:11:42

Google App SDKGQL

2009-10-16 09:08:59

App Engine

2009-09-02 11:34:09

Google App

2011-09-15 10:29:13

架构

2013-07-30 12:29:19

Google App Google技术Engine

2010-12-01 10:49:52

Google App

2009-09-08 09:45:23

App Engine性

2009-08-07 13:53:14

App Engine

2009-04-09 09:53:43

GoogleAppEngineJava
点赞
收藏

51CTO技术栈公众号