使用事件模型定制Grails应用的行为

无论在构建过程中,还是在创建单个组件(如领域类、控制器)时,典型的Grails应用都会在应用生命周期的关键点抛出事件。我们可以将这些应用事件作为扩展点来创建监听器对其进行拦截,并使用定制行为对其作出响应。除了HTTP请求和响应这种传统的Web应用生命周期以外,Grails还提供了大量定制的接触点,开发者可以利用它们处理事件模型、给出定制的应用行为。这些接触点包括:

在构建阶段抛出的事件,

Web应用的启动和关闭,

Grails领域类的生命周期事件。

针对Gant脚本的事件处理器首次出现在0.5版中,并在Grails目标和插件脚本的执行过程中被触发。它们在Events.groovy脚本中以闭包的集合形式实现(就像Grails中的其它东西一样),其名称都以“event”开头。当Gant脚本中发生“事件”时,Grails就会调用相应的事件闭包。Grails在如下位置搜寻这些脚本:

USER_HOME/.grails/scripts——用户特定的事件处理器

PROJECT_HOME/scripts——应用特定的事件处理器

PROJECT_HOME/plugins/*/scripts——插件特定的事件处理器

我们可以在宏观以及微观层次处理Grails的事件。宏观层次就是构建和应用范围,而微观层次处于领域层,领域类在与数据库发生交互时发布事件。最近Scott Davis撰写了一篇文章,谈到了Grails的事件模型以及贯穿于Grails应用生命周期的事件如何能帮助开发者更好地定制应用的行为。开发者可以通过创建一个Events.groovy文件、并在其中编写定制代码来扩展构建过程,而无需修改标准的Grails脚本。

构建事件:

“grails create-app”和“grails run-app”(或者是“grails war”)之间所有的构建过程步骤都会在关键点抛出事件。你可以通过创建监听器来监听项目中的这些构建事件。 这些事件还可用于安装后配置和应用升级。当你想定制GRAILS_HOME/scripts中的脚本时(以抛出定制事件),Scott建议将这些文件拷贝到项目中的scripts目录中,以便这些客户化脚本也与其他文件一样被加到源码控制系统中。

应用事件:

除了构建事件,Grails开发者还可以捕获应用事件以定制应用的逻辑。在Grails每次启动和停止时,位于grails-app/conf目录中的引导文件都会运行。该文件中的init块会在应用启动时被调用,destroy块会在应用停止时被调用。如果想在init和destroy事件触发时查看调试信息,请键入以下命令以交互模式启动Grails:

grails interactive"

扩展应用事件的一个例子就是在启动时向数据库增加新的记录。Scott提到了在BootStrap.groovy中利用Failsafe数据库进行插入和删除以避免数据库中的重复记录。他还解释了Bootstrap脚本中特定于环境(开发、测试或者产品)的行为。这要使用GrailsUtil类,请在脚本开头导入grails.util.GrailsUtil,并调用静态方法GrailsUtil.getEnvironment()来确定你正处在哪种模式下(由于Groovy简化的getter语法,该方法调用可以简写为GrailsUtil.environment)。

领域类事件:

这包括针对CRUD操作的四个事件回调:onLoad、beforeInsert、befortUpdate及beforeDelete,当执行数据库操作时就会触发它们。

onLoad在类从数据库中加载时被调用。

beforeInsert在save()方法执行前被调用。

beforeUpdate在update()方法执行前被调用。

beforeDelete在delete()方法执行前被调用。

Grails支持GORM事件及Hibernate插件,以对上述事件进行补充。GORM事件的定制包括事件的注册,在删除、插入及更新发生时会触发这些事件。Hibernate的事件插件为领域模型提供了支持,可以使用以下这些方法来对Hibernate的事件系统进行回调:afterInsert、afterUpdate、afterDelete、 beforeLoad、afterLoad、beforeSave及afterSave。其它的领域层事件就是领域类的时间戳了。如果你提供了一对特别命名的字段(lastUpdated与dateCreated),GORM就会自动为类增加时间戳。

在Web应用的其它层上,Grails提供了Web流执行事件以管理Web流的执行(从一种状态转化为另一种状态)和Ajax事件(如果Web应用中发生了某个事件就会去调用一个特定的JavaScript函数)。

Grails还支持对自动重新加载事件的拦截,这可用来监控资源的改变,当发生变化时会重新加载资源。这就是Grails在运行时能重新加载应用的原因。

查看英文原文:

http://www.infoq.com/news/2008/09/grails-event-model

时间: 2024-10-28 07:40:42

使用事件模型定制Grails应用的行为的相关文章

精通Grails: Grails 事件模型

对于事件驱动的反应性开发,构建 Web 站点是一门学问.您的应用程序是不是很空闲,焦虑地等待用 户发送请求,然后它传回响应,再返回休眠状态,直到下次调用.除了传统的 Web 生命周期的 HTTP 请 求和响应,Grails 还提供了大量自定义接触点,您可以在此进入事件模型并提供自己的行为. 在本文中,您将发现构建过程中会抛出很多事件.需要自定义地启动和关闭应用程序.最后,探讨 Grails 域类的生命周期事件. 构建事件 开发 Grails 的第一步是输入 grails create-app.最

浅析ADO 事件模型

ado "ADO 事件模型"支持某些同步或异步的 ADO 操作,这些操作在其开始之前或完成之后能够引发事件."事件"实际上是对事件处理程序例程的调用. 操作开始前调用的事件处理程序用于检查或修改操作参数,此后可删除操作或使其完成.由于 ADO 2.0 支持异步操作,所以操作完成后调用的事件处理程序特别重要.例如,启动异步Recordset.Open 操作的应用程序在操作完成时,通过执行完毕事件来获得通知. 有两类事件: ConnectionEvents - 当连接的

ExtJS框架的事件模型及其常用功能

前言 工作中用ExtJS有一段时间了,Ext丰富的UI组件大大的提高了开发B/S应用的效率.虽然 近期工作中天天都用到ExtJS,但很少对ExtJS框架原理性的东西进行过深入学习,这两天花了些时间学习 了下.我并不推荐大家去研究ExtJS框架的源码,虽然可以学习其中的思想和原理,但太浪费精力了,除 非你要自己写框架. 对于ExtJS这种框架,非遇到"杂症"的时候我觉得也没必要去研究其源码和 底层的原理,对其一些机制大致有个概念,懂得怎么用就行,这也是本篇博文的主要目的. Ext自 己的

新的事件模型(java)

在新的事件模型的组件可以开始一个事件.每种类型的事件被一个个别的类所描绘.当事件开始后,它受理一个或更多事件指明"接收器".因此,事件源和处理事件的地址可以被分离. 每个事件接收器都是执行特定的接收器类型接口的类对象.因此作为一个程序开发者,我们所要做的是创建接收器对象并且在被激活事件的组件中进行注册.event-firing组件调用一个addXXXListener()方法来完成注册,以描述XXX事件类型接受.我们可以容易地了解到以addListened名的方法通知我们任何的事件类型都

回调函数与Delphi的事件模型

回调函数: 回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象.这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数. 这种方式,调用者在一个线程,被调用者在另一个线程. 在Windows API中有一些函数使用回调函数,例如CreateThread.SetWindowLong等.对应的回调函数定义

传统javascript事件模型实现观察者模式

在W3C新的事件模型框架中,IE和Mozilla都实现了相应的版本,IE的是attachEvent和detachEvent来实现元素事件的添加和删除,而Mozilla则是标准的addEventListener和 removeEventListener.在传统的javascript事件模型中,我们没办法为一个页面元素注册多个事件,只有靠自己来实现观察者模式.代码来自<ajax in action>,我添加了注释 //命名空间var jsEvent = new Array(); //构造函数jsE

用IE 10触控事件模型调试响应式Web设计

目前我正在研究IE 10触控事件.虽然我已经十分幸运地拥有了一台Windows 8平板电脑,但是我仍在寻找一种更加简便的方法,即无需每次切换至平板电脑,便可直接在经典笔记本上执行基本测试的方法.在寻找该方法的过程中,我发现了一些技巧和窍门,有了这些经验,您就可以在不使用触控设备的情况下,对代码中的IE 10触控事件进行调试了.正面效应:这种方法还可帮助您测试.调试响应式Web设计! 先决条件:在学习本教程之前,首先需要执行下列步骤: IE 10触控事件模型 如果您对触控执行方式还不甚了解,可以先

编写高质量代码改善C#程序的157个建议[C#闭包的陷阱、委托、事件、事件模型]

原文:编写高质量代码改善C#程序的157个建议[C#闭包的陷阱.委托.事件.事件模型] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议38.小心闭包中的陷阱 建议39.了解委托的实质 建议40.使用event关键字对委托施加保护 建议41.实现标准的事件模型 建议38.小心闭包中的陷阱 首先我们先来看一段代码: class Program { static void Main(string[] arg

ios上safari的事件模型(一)

safari在desktop端和mobile端大部分的功能都是一样,我们重点说下差别在什么地方,以及这些差别所引起的问题.我们知道ios在mobile端增加了触摸的功能,触摸功能肯定要用到手指的操作,这个是和desktop端有很大区别的.当我们用手指操作的时候,可能用到一个手指,两个手指或者多个手指,同时手指触摸到不同的dom元素会引起什么不同的行为,我们主要围绕这些问题展开. 名词解释: clickable元素:link,form,image和拥有mousemove, mousedown, m