技术开发 频道

精通 Grails: Grails 事件模型

  【IT168技术文档】对于事件驱动的反应性开发,构建 Web 站点是一门学问。您的应用程序是不是很空闲,焦虑地等待用户发送请求,然后它传回响应,再返回休眠状态,直到下次调用。除了传统的 Web 生命周期的 HTTP 请求和响应,Grails 还提供了大量自定义接触点,您可以在此进入事件模型并提供自己的行为。

  在本文中,您将发现构建过程中会抛出很多事件。需要自定义地启动和关闭应用程序。最后,探讨 Grails 域类的生命周期事件。

  构建事件

  开发 Grails 的第一步是输入 grails create-app。最后输入 grails run-app 或 grails war。这期间输入的所有命令和内容都会在过程的关键点抛出事件。

  查看 $GRAILS_HOME/scripts 目录。此目录中的文件是 Gant 脚本,对应输入的命令。例如,输入 grails clean 时,调用 Clean.groovy。

  在文本编辑器中打开 Clean.groovy。首先看到的目标是 default 目标,如清单 1 所示:

  清单 1. Clean.groovy 中的 default 目标

target ('default': "Cleans a Grails project") {
   clean()
   cleanTestReports()
}

  可见,它的内容并不多。首先运行 clean 目标,然后运行 cleanTestReports 目标。调用堆栈后,看一下 clean 目标,如清单 2 所示:

  清单 2. Clean.groovy 中的 clean 目标

target ( clean: "Implementation of clean") {
    event(
"CleanStart", [])
    depends(cleanCompiledSources, cleanGrailsApp, cleanWarFile)
    event(
"CleanEnd", [])
}

  如果需要自定义 clean 命令的行为,可以在此添加自己的代码。不过,使用此方法的问题是:每次升级 Grails 时都必须迁移自定义内容。而且从一台计算机移动到另一台计算机时,您的构建会更容易出错。(Grails 安装文件很少签入版本控制 — 只检签入用程序代码)。为了避免可怕的 “but it works on my box” 综合症,我倾向于将这些类型的自定义内容放在项目中。这确保来自源控件的所有新签出都包含成功构建所需的自定义内容。如果使用持续集成服务器(比如 CruiseControl),也有助于保持一致性。

  注意,在 clean 目标期间会抛出几个事件。CleanStart 在过程开始之前发生,随后发生 CleanEnd。您可以在项目中引入这些事件,将自定义代码与项目放在一起,不要改动 Grails 安装文件。您只需要创建一个监听器。

  在项目的脚本目录中创建一个名为 Events.groovy 的文件。添加清单 3 所示的代码:

  清单 3. 向 Events.groovy 添加事件监听器

eventCleanStart = {
  println
"### About to clean"
}

eventCleanEnd
= {
  println
"### Cleaning complete"
}

  如果输入 grails clean,应该看到类似于清单 4 的输出:

  清单 4. 显示新注释的控制台输出

$ grails clean

Welcome
to Grails 1.0.3 - http://grails.org/
Licensed under Apache Standard License
2.0
Grails home
is set to: /opt/grails

Base Directory:
/src/trip-planner2
Note: No plugin scripts found
Running script
/opt/grails/scripts/Clean.groovy
Environment
set to development
Found application events script
### About
to clean
  [delete] Deleting:
/Users/sdavis/.grails/1.0.3/projects/trip-planner2/resources/web.xml
  [delete] Deleting directory
/Users/sdavis/.grails/1.0.3/projects/trip-planner2/classes
  [delete] Deleting directory
/Users/sdavis/.grails/1.0.3/projects/trip-planner2/resources
### Cleaning complete

  当然,您可以不向控制台写入简单的消息,而是进行一些实际工作。可能需要删除一些额外的目录。您可能喜欢通过用新的文件覆盖现有文件来 “重置” XML 文件。任何能在 Groovy(或通过 Java 编程)中完成的工作都可以在这里完成。

0
相关文章