简单测试了一下,语法比ruby稍罗嗦一点,不过也算是很简洁了。
在WINDOWS下执行,遇到个小BUG,grails.bat第4行:if "%GRAILS_HOME"=="" goto grailsHomeNotSet是错误的,改成if "%GRAILS_HOME%"=="" goto grailsHomeNotSet就可以了。后面也有点小问题,干脆在LINUX下测试。
照着Quick Start做了一下,还算顺利,不过例子怎么只给了个list呢?怎么也得把create/update/delete给完成嘛。
猜着写了个create:
@Property create = {
[ post : new Post() ]
}
@Property save = {
new Post(params).save()
redirect(action:list)
}
怎么存进去的不是我那个字符串,而是[Ljava.lang.String;@18b5a73呢。。
又看了下文档,在controller里面是这么用的:
@Property save = {
def post = new Post()
post.properties = params
post.save()
redirect(action:list)
}
其它都很相似:
class PostController {
@Property index = { redirect(action:list) }
@Property list = {
[ postList : Post.list() ]
}
@Property create = {
[ post : new Post() ]
}
@Property save = {
def post = new Post()
post.properties = params
post.save()
redirect(action:list)
}
@Property show = {
[ post : Post.get(params['id']) ]
}
@Property delete = {
Post.get(params['id']).delete()
redirect(action:list)
}
@Property edit = {
[ post : Post.get(params['id']) ]
}
@Property update = {
def post = Post.get(params['id'])
post.properties = params
post.save()
redirect(action:list)
}
}
语法上比RoR稍麻烦点。
接着测试一下查询:
@Property list = {
def title = params['title']
def body = params['body']
def postList
def c = Post.createCriteria()
//if (title != null && title != "" && body != null && body != "")
if (title && body)
postList = c{
like("title", "%" + title + "%")
like("body", "%" + body + "%")
}
else if (title)
postList = c{
like("title", "%" + + title + "%")
}
else if (body)
postList = c{
like("body", "%" + body + "%")
}
else
postList = Post.list()
[ postList : postList, post : new Post() ]
}
list.gsp里面添加:
<g:form action="list" method="post">
<div class="dialog">
<table>
<tr class='prop'>
<td valign='top' style='text-align:left;' width='20%'>
<label for='title'>Title:</label>
</td>
<td valign='top' style='text-align:left;' width='80%'
class='${hasErrors(bean:post,field:'title','errors')}'>
<input type='text' name='title' value='${post?.title}' />
</td>
</tr>
<tr class='prop'>
<td valign='top' style='text-align:left;' width='20%'>
<label for='body'>Body:</label>
</td>
<td valign='top' style='text-align:left;' width='80%'
class='${hasErrors(bean:post,field:'body','errors')}'>
<input type='text' name='body' value='${post?.body}' />
</td>
</tr>
</table>
</div>
<div class="buttons">
<span class="formButton">
<input type="submit" value="Search"></input>
</span>
</div>
</g:form>
groovy写代码挺烦的,局部变量也要def来定义?不定义就提示该变量不是对象的字段,跟很多脚本语言都不一样。如果从java上转过来,会觉得还是挺简洁的。
借助spring、hibernate,Grails所做的就是整合,groovy这个语言好像并没有特别出众的地方,大部分东西在其它脚本语言里面都能看到。我觉得ruby更容易扩充,更自由。Grails要想成功,除非在效率上大幅度领先,就测试来看,并没有觉得很快,它也没提供个评测工具。据说ruby2.0也要重写虚拟机,如果ruby只是稍慢一些,自然还是选RoR比较好。