领先一步
VMware 提供培训和认证,助您加速进步。
了解更多[caption id="attachment_1577" align="alignright" width="250" caption="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 应用程序本身的各个方面。如您所见,这相当容易。
安装 SDK 后,在本教程的过程中,您还应该下载并安装 Groovy 1.6。您只需要在本文的第一部分安装 Groovy,我们需要编译一个 servlet;否则,在本文的其余部分,您将不再需要它,因为我们将使用由 Groovy 运行时本身编译的 Groovlets。
安装 Java、SDK 和 Groovy 后,我们可以进一步操作,并从此Groovy 就绪项目模板中开始一个新项目。下载该骨架,将其解压缩到您喜欢的目录中,然后让我们看看我们有什么!这就像打开一个圣诞礼物吗?
我已将模板项目解压缩到名为 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、映射等等。
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-app xmlns="http://appengine.google.com/ns/1.0"> <application>myowngroovy</application> <version>1</version> </appengine-web-app>
import javax.servlet.http.*这看起来非常像一个普通的 Java servlet,尽管您会注意到 Groovy 提供的更简单的语法:没有分号,可选的 public 关键字,用于 getters/setters 的属性表示法,以及省略分号。class HelloServlet extends HttpServlet { void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.contentType = "text/plain" resp.writer.println "Hello Google App Engine Groovy!" } }
下一步:我们需要在 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
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 是存储在 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 的工作。
这不是很简单吗?
目前,Groovlets 和普通 servlets 完全受支持,但例如,Grails 应用程序在当前版本的 Google App Engine 上无法运行。我们将继续与 Google App Engine 团队合作解决此问题,以便您也可以使用 Grails 来处理更苛刻的应用程序。
如果您想了解更多关于 Groovy 和 Grails 的信息,以及如何编写由 Groovy 驱动的 App Engine 应用程序,您也可以考虑注册并参加GR8 Conference,这是一个专门讨论 Groovy、Grails 和 Griffon 的会议,届时将有这些技术的专家或开发者作为演讲者,并有实践操作环节。随着 App Engine 支持 Groovy 的宣布,毫无疑问我们也会在会议上讨论这一点!
我们期待阅读您关于 Groovy 在 App Engine 上的反馈,并且我们很乐意听取您关于如何进一步改善在云端开发 Groovy 应用程序体验的所有建议。