msgbartop
用铅笔写日记,记录那最原始的美丽
msgbarbottom

基于Gaelyk框架快速开发谷歌云计算应用

其实这篇文章很久就打算写了,本来的想法是计划等到我的wp4gae项目有了博客雏形的时候,顺便写出来的。

可是事与愿违,我打算用groovy实现绘制验证码遇到了技术瓶颈,项目就一下子死在那了…详见邮件列表存档 囧rz

这一死就死了近两个月……好了,言归正传,话说用gaelyk 开发谷歌云计算(简称GAE)还是蛮棒的,而且它也是难得的几个面向GAE平台的groovy框架.

我就是在groovy官网看到它的链接的,主页是:http://gaelyk.appspot.com/,可以说gaelyk是一个又轻量级又强大易用的框架.

首先,确保本地eclipse(原谅我,我用的是eclipse) 安装了Google App Engine Plugin for Eclipse,Groovy-Eclipse 插件.
根据消息,后者最新版本为 Groovy-Eclipse 2.0.2,安装地址为:
http://dist.springsource.org/release/GRECLIPSE/e3.5/
http://dist.springsource.org/release/GRECLIPSE/e3.6/ (for Helios)

顺便说一句,eclipse 最新版本3.6 在widnows下有内存溢出现象,经常导致假死,这已经是公认bug了.

在groovy 和 gae 插件安装了后,现在可以创建基于gaelyk的项目。
有两种选择:
1,只下载 gaelyk-0.4.2.jar 文件,在项目中导入.缺点是必须对项目目录结构很清楚。
2,就是下载官方提供好的项目模板,解压后,可以直接导入到eclipse中。而且里面还自带了一些GAE的jar包.

本人选择的是后者方法,里面还有一些例子,可以参考学习.

一切完成后,目录结构如图:
gaelyk-directory-layout

前期工作好了后,就可以开始开发项目了.

习惯了一般的b/s开发,忽然转变到云计算平台,一般人都不会太舒服。不过gaelyk 是遵循经典的MVC模式的,它把视图和后台的逻辑处理很明显的分开了.

视图前台显示部分交给了视图模板 *.gtpl(相当于jsp),而把处理程序通通放在了Groovlet 里(类似servlet)。这样的话,思路就变的清晰了.

和jsp一样,gaelyk提供如 request、response、appliaction、session 等隐式对象,随用随拿.

当然,gaelyk 还提供了一些特殊的内置对象,比如 params(据说是学ruby on rails),就是一个封装了请求体里面参数的键值对集合, 或者像 headers,就是请求头里面的信息,以供用户调用.
厌烦了log4j ?不妨尝试下 gaelyk的 GroovyLogger,一样很棒。

除了这些个一开始就实例化好待用的对象,官方叫它“积极变量”,gaelyk 还提供了一些“消极变量”(即第一次请求时才实例化),
有点类似于 饿汉模式 和 懒汉模式阿.
如 out、html.

当然还有一些 gae 的对象,如 datastore,用于操作数据库.厌烦了gae 自带的jdo、jpa 方式。尝试一下gaelyk的条件式查询,很是方便。最重要的一点是其中不会产生一句sql语句,呵呵,sql不好的同学们有福了 :)

在gtpl 视图模板里面,默认支持el表达式,原生态支持 小脚本、代码块以及表达式.(因为groovy也是java 囧rz)
还有更有趣的,gaelyk 导入类时支持通过 as xxx 起别名,很方便.而跳转和重定向的时候也有简洁的办法,直接 forward "url"、redirecr "url" 即可,再也不用Request.xxx.dispatch.xxxx.findforward 了.

gaelyk 还有一个亮点就是,支持地址重写.只要稍稍编辑 web.xml (交由 RoutesFilter 处理),再指定规则文件.
就可以实现伪静态了.
如 get "/topic/@title" forward:"/showtopic.groovy?title=@title" 即可.而且还可以通过 validate 进行验证,过滤掉非法参数. 让被注入成为往事. 呵呵
并且,从gaelyk 0.4.1 开始,支持缓存 cache 了.如 cache: 3.hours 即缓存3小时.

还有更让人叫绝的,gaelyk 里面根本不需要实体类,呵呵
因为Entity对象是可以直接构造的,而且groovy 里面没有对象类型的区分(灰常像php、javascript),也就给了方便.
比如我创建一个用户,包含用户名、密码.

Entity entity = new Entity("user"); 注意导包 import com.google.appengine.api.datastore.Entity

然后只需要用户从表单提交对应的值过来。填充入user实体中.
还在用request.getxxxbyxxx???忘了上面提到的 params ?

gaelyk 提供你想不到的方法访问实体,
entity['name'] = params['name']
或者
entity.password = params['password']

亦可 entity << params 全部填充.

这时候,只需调用 entity的 save() 方法,就可以将数据持久化了.
删除只需同样调用 entity 的 detele() 方法即可,若需起事务,只需把语句放入datastore.withTransaction{}的闭包中即可.

怎么样?增删就是如此的简单.

至于查询,更是简单.指定要查询的实体,扔给几个条件、标准就出来了(有点类似hibernate的Criteria查询).
创建query.
def query = new Query("user")

给出条件(相当于sql where)
query.addFilter("name", Query.FilterOperator.EQUAL, "xxx")

指定排序(相当于sql order by)
query.addSort("name", Query.SortDirection.DESCENDING)

预编译
PreparedQuery preparedQuery = datastore.prepare(query)

设定单次结果集大小,和漂移位置.实现分页
def list = preparedQuery.asList(withLimit(10).offset(20)) //查询20到30列.

这样增删查均完成了.gaelyk 真的是很省事呀.

当然,gaelyk 提供远不止这些,还有像 email 功能、memcache 功能、 BlobStore 、queue 等功能.这些我都没有用过,将来可能会更多.

不过作为一个开发者来说,这样的框架只会让我们的工作越来越方便,效率越来越高.

关于gaelyk 的更多例子,见:http://gaelyk.appspot.com/tutorial
如果对我的wp4gae源码有兴趣,请看:http://code.google.com/p/wp4gae/source/browse/

wp4gae现运行于 http://xia-zhengxin.appspot.com/,欢迎围观.
注:相当alpha的版本.