Skip to end of metadata
Go to start of metadata

引言

Groovy 支持多种动态生成文本的方式,包括 GStringsprintf(如果使用 Java 5),还有 MarkupBuilder。除了这些,还有专用的模板框架(template framework),它适用于使用静态模板生成文本的应用程序。

模板框架(Template framework)

Groovy 的模板框架包括一个抽象基类 TemplateEngine 和一个接口 Template。引擎(engines)必须实现 TemplateEngine,而生成的结果模板(resulting templates)必须实现 Template

Groovy 有多种模板引擎:

  • SimpleTemplateEngine-用于基本模板
  • GStringTemplateEngine-将模板作为可写的闭包保存(适用于流的操作)
  • XmlTemplateEngine-适用于模板和输出都是有效 XML 的情况

SimpleTemplateEngine

为了生成参数化的文本(parameterized text)SimpleTemplateEngine 允许你在模板中使用类似 JSP 代码(JSP-like scriptlets)(如下例)、脚本和表达式语言(EL)。

虽然一般并不提倡在模板(或者视图-view)中混进处理逻辑,但有时写一些非常简单的逻辑没有大碍。例如上例,我们可以修改一下:

可以改为(假设在模板中已经 import 了 capitalize):

再比如:

可以改为:

高级使用说明(Advanced Usage Note)

如果你直接将模板嵌到脚本中(就像我们上面做的那样),一定要注意反斜线(\)字符。因为模板中的字符串本身也要经过 Groovy 的解析,然后才会传递到模板框架(templating framework)。GString 表达式和脚本代码都是 Groovy 程序,所以在这些代码中的反斜线必须转义。例如,我们想用引号把上面的 The Big Apple 引起来,就要用:

类似的,换行要用:

"\n" 可以在静态模板文本中使用,也可以在外部模板文件中使用。同样,如果要显示反斜线本身,要用

Icon

原文本中,此处就有点问题

注意:如果能找到更好的办法,以后的 Groovy 版本中可能就不需要多出来的这个反斜线了。

GStringTemplateEngine

这是使用 GStringTemplateEngine 的例子,和上面的例子类似,不过使用了更多的参数。这次我们要把模板保存到文件中:

test.template

注意,我们使用 out 而不是 print,这样可以支持 GStringTemplateEngine 的流特性。因为模板是一个单独的文件,就不需要再使用转义符了。调用过程如下:

输出为:

你也可以插接其它的模板方案,如 GFreeMarkerVelocityStringTemplateCanvas,或者其它的。

如果你想在 Ant 中使用 Groovy 模板,可以考虑 Gpp.

用 TemplateServlet 处理类似 JSP 的 HTML 文件(Using TemplateServlet to serve single JSP-like HTML files)

注意!Groovlets 和 Templates 完全不同。

Icon
 

TemplateServletGroovletsGroovyServlet) 联合工作。模板框架会将 HTML(或其它格式,比如模板文件)中的源码自动生成 Groovy 脚本。脚本会保存在一个 .groovy 文件中,GroovyServlet(和 GroovyScriptEngine)会处理这个文件。另外生成脚本后,模板会被求值(evaluate)并返回客户端。

下面是一个简单的 helloworld.html 文件,这个文件无法经过验证,而且没有 head 。只是演示 Groovy 是如何编译并处理 HTML 文件,然后返回客户端的。标签(tag)语法和 JSP 很像,也很容易阅读:


第一个代码块(一个 for 循环)持续输出 HelloWorld!。猜猜会是什么样?第二部分输出 servlet 的 session id,如果 session 存在。session 变量是诸多默认绑定关键字中的一个。详情参见 ServletBinding

这是一些使用 http://jetty.mortbay.org 容器的示例。在jetty6.0中,通过 Grape 添加依赖,使用下面代码创建一个微型的 web 服务器。为了测试,将上面的 helloworld.html 放入当前目录,并在浏览中访问 http://localhost:1234/helloworld.html

下面是 web.xml 示例

延伸阅读(Further reading)

Article on templating with Groovy templates
GroArticle on templating with Groovlets and TemplateServlets
Blog about combining Groovy and FreeMarker

  • No labels