Grails使用的是SiteMesh。这是最早在WebWork下使用的布局引擎。但是随着Struts的普及,Tiles的使用远远超过了SiteMesh。不过SiteMesh实现的布局很简介优雅,不需要编写很多劳什子的布局xml文件。
现在SiteMesh集成进Grails,使用起来也更简单了。下面的截图,就是使用SiteMesh的页面。
日志引用
开发环境下经常需要一些模拟测试数据。比如数据库中要有一些初始的实体。Grails提供了很好的办法。可在BootStrap.groovy中:
编写只针对开发环境的初始化代码:
import bookproto.Book
class BootStrap {
def init = { servletContext ->
environments{
development{
def book=new Book(name:"中国史学史")
book.save()
println """book id: ${book.id}"""
}
}
}
def destroy = {
}
}
以上示例是在Grails的GORM中使用uuid基础上做的处理。
帮助公司发一个招聘广告。招聘Android和iOS实习生。
招聘内容如下:
要求:
- 在读学生,院校在北京
- 所学专业和软件开发相关
- 本科(暑假后上大四)或者研究生(暑假后上研二)
- 有充足的时间,除了学校临时有事,能基本正常上班
- 掌握一门面向对象语言,比如Java或者C++,并编写过成型的应用
- 有责任心,能认真完成交付的工作任务
- 有较好的双向沟通能力
实习内容:
- 在资深程序员的帮助下,掌握Android开发基础知识
- 和资深程序员结对编程,实现项目应用
- 在实习中能力较强者,在自愿的前提下,可转为iOS的开发
如有符合条件且有兴趣的朋友,可发简历到:hr@witmob.com
开发中,有很多情况需要使用不连续的随机生成的唯一标识。好处是:
- 可以隐藏商业细节,比如生成订单,自增列会暴露商业秘密
- 另外,自增列往往依赖数据库生成,对集群和分布式部署应用有影响,还有就是导入数据时需要对数据库自增列做设置
因此,使用uuid做实体唯一标识的地方很常见。在Grails实现实体自身多对多的变通方案基础上,把默认的native生成主键的方式改为使用uuid:
class Book {
static constraints = {
bookRelation(nullable:true)
}
static mapping = {
id generator:’uuid.hex’, params:[separator:'-']
}
String id
String name
BookRelation bookRelation
}
Grails中的GORM,是自动的对象关系映射api。封装了Hibernate,功能应该是Hibernate的子集,不过借助强大的groovy语言使用起来更方便。
项目中需要实现实体自身多对多的关系。图书和相关图书。
一本书,有0到多个相关图书。一本书,还可能被0到多个图书相关。这里要注意啦,这两个集合不是重合的。即,a图书的相关图书有b,但b不一定相关图书有a。这也好比,你的朋友中,有人未必拿你当朋友,呵呵。
回退的原因是,在mac环境下,1.4m1版本,修改controller后,系统不能自动的reload。用过grails的人应该知道,重启一次grails是个比较漫长的过程。讨论这个问题的帖子可见:
http://grails.1312388.n4.nabble.com/1-4-M1-Controller-reloading-seems-to-be-broken-td3556582.html
另外,bug链接:
虽然报告的是win7下的问题,但是应该是类似的。虽然已经fixed了,但是是尚未发布build版本的2.0-M1。
javascript开发中也会用到观察者模式。比如当数据模型改变后,会触发事件。订阅该事件的子视图都将会得到事件,并触发它们调用代码刷新自己的内容。
比如下面要实现的一个简单例子,一上来是这样的:
当修改文本框中的文字并点击保存后:
这里是用Java写的示例。如何知道当前的设备有几个网卡:
Enumeration<NetworkInterface> enumeration= NetworkInterface.getNetworkInterfaces();
while(enumeration.hasMoreElements()){
NetworkInterface networkInterface=enumeration.nextElement();
System.out.println(networkInterface);
}
在我本机上显示:
name:en1 (en1) index: 5 addresses:
/192.168.0.172;
/fe80:0:0:0:7aca:39ff:feb5:a315%5;name:lo0 (lo0) index: 1 addresses:
/127.0.0.1;
/fe80:0:0:0:0:0:0:1%1;
/0:0:0:0:0:0:0:1;
在Grails使用JQuery UI实现最简单自动完成中实现了简单的自动完成。但是不具实战意义。因为一般自动完成都是通过ajax的方式在服务器端自动获取的。
这里实现一个简单的通过Ajax实现的示例。首先,在服务器端创建一个假的返回结果页面。url为:
正式使用的时候,这个url可以是动态返回结果的,比如这样:
返回的结果格式为json,这里把Grails使用JQuery UI实现最简单自动完成中的数组直接拿过来即可:
Grails 1.4已经默认集成JQuery了。加入很方便,在gsp页面中:
<html>
<head>
<r:require module="jquery"/>
<r:layoutResources/>
</head>
<body>
</body>
</html>
通过浏览器查看该文件,可以确定使用的jquery的哪个版本:
<html>
<head>
<script src="/AjaxDemos/static/plugins/jquery-1.6.1.1/js/jquery/jquery-1.6.1.min.js" type="text/javascript" ></script>
</head>
<body>
</body>
</html>