快速业务通道

精通Grails: Grails 事件模型 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
ripts/Events.groovy 中创建相应的 监听器,并高度自定义构建环境。

抛出自定义事件

显然,现在已经了解相关的原理,您可以随意添加自己的事件了。如果确实需要自定义 $GRAILS_HOME/scripts 中的脚本(我们随后将进行此操作以抛出自定义事件),我建议将它们复制到项 目内的脚本目录中。这意味着自定义脚本会和其他内容一起签入到源控件中。Grails 询问运行哪个版本 的脚本 — $GRAILS_HOME 或本地脚本目录中的脚本。

将 $GRAILS_HOME/scripts/Clean.groovy 复制到本地脚本目录,并在 CleanEnd 事件后添加以下事件 :

event("TestEvent", [new Date(), "Some Custom Value"])

第一个参数是事件的名称,第二个参数是要返回的项目列表。在本例中,返回一个当前日期戳和一条 自定义消息。

将清单 8 中的闭包添加到 scripts/Events.groovy:

清单 8. 捕获自定义事件

eventTestEvent = {timestamp, msg ->   println "### ${msg} occurred at ${timestamp}" }

输入 grails clean 并选择本地脚本版本后,应该看到如下内容:

### Some Custom Value occurred at Wed Jul 09 08:27:04 MDT 2008

精通Grails: Grails 事件模型(4)

时间:2011-07-25 IBM Scott Davis

启动

除了构建事件,还可以引入应用程序事件。在每次启动和停止 Grails 时会运行 grails- app/conf/BootStrap.groovy 文件。在文本编辑器中打开 BootStrap.groovy。init 闭包在启动时调用。 destroy 闭包在应用程序关闭时调用。

首先,向闭包添加一些简单文本,如清单 9 所示:

清单 9. 以 BootStrap.groovy 开始

def init = {   println "### Starting up" } def destroy = {   println "### Shutting down" }

输入 grails run-app 启动应用程序。应该会程序末尾附近看到 ### Starting Up 消息。

现 在按 CTRL+C。看到 ### Shutting Down 消息了吗?我没有看到。问题在于 CTRL+C 会突然停止服务器, 而不调用 destroy 闭包。Rest 确保在应用服务器关闭时会调用此闭包。但无需输入 grails war 并在 Tomcat 或 IBM®WebSphere® 中加载 WAR 来查看 destroy 事件。

要查看 init 和 destroy 事件触发,输入 grails interactive 以交互模式启动 Grails。现在输入 run-app 启动应用程 序,输入 exit 关闭服务器。以交互模式运行会大大加快开发过程,因为 JVM 一直在运行并随时可用。 其中一个优点是,与使用 CTRL+C 强硬方法相比,应用程序关闭得更恰当。

在启动期间向数据库 添加记录

使用 BootStrap.groovy 脚本除了提供简单的控制台输出,还能做什么呢?通常,人们 使用这些挂钩将记录插入数据库中。

首先,向先前创建的 Hotel 类中添加一个名称字段,如清单 10 所示:

清单 10. 向 Hotel 类添加一个字段

class Hotel{  String name }

现在构建一个 HotelController,如清单 11 所示:

清单 11. 创建 一个 Hotel Controller

class HotelController {  def scaffold = Hotel }

注意:如果像 “Grails 与遗留数据库” 中讨论的那样禁用 grails- app/conf/DataSource.groovy 中的 dbCreate 变量,本例则应该重新添加它并设置为 update。当然,还 有另一种选择是通过手动方式让 Hotel 表与 Hotel 类的更改保持一致。

现在将清单 12 中的代 码添加到 BootStrap.groovy:

清单 12. 保存和删除 BootStrap.groovy 中的记录

def init = { servletContext ->   new Hotel(name:"Marriott").save()   new Hotel(name:"Sheraton").save() } def destroy = {   Hotel.findByName("Marriott").delete()   Hotel.findByName("Sheraton").d

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号