引言
Groovy 支持多种动态生成文本的方式,包括 GStrings,printf(如果使用 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" 可以在静态模板文本中使用,也可以在外部模板文件中使用。同样,如果要显示反斜线本身,要用
|
原文本中,此处就有点问题 |
注意:如果能找到更好的办法,以后的 Groovy 版本中可能就不需要多出来的这个反斜线了。
GStringTemplateEngine
这是使用 GStringTemplateEngine 的例子,和上面的例子类似,不过使用了更多的参数。这次我们要把模板保存到文件中:
注意,我们使用 out 而不是 print,这样可以支持 GStringTemplateEngine 的流特性。因为模板是一个单独的文件,就不需要再使用转义符了。调用过程如下:
输出为:
你也可以插接其它的模板方案,如 GFreeMarker、Velocity、StringTemplate、Canvas,或者其它的。
如果你想在 Ant 中使用 Groovy 模板,可以考虑 Gpp.
用 TemplateServlet 处理类似 JSP 的 HTML 文件(Using TemplateServlet to serve single JSP-like HTML files)
| 注意!Groovlets 和 Templates 完全不同。 |
TemplateServlet 和 Groovlets(GroovyServlet) 联合工作。模板框架会将 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