Groovy模板引擎上(基础模板介绍)

简介:

原文链接 作者:groovy团队  译者:树下偷懒的蚁

1.简介
Groovy支持多种方式动态的生成文本譬如:GStrings, printf(基于Java5),MarkupBuilder 。除此之外,模板框架则是非常适用基于静态模板生成文本的应用程序。

2.模板框架

在Groovy中,模板框架包含TemplateEngine抽象基类(引擎必须实现),Template接口(引擎生成的模板必须实现)。

Groovy包含的以下几种模板引擎:

  • SimpleTemplateEngine -基础模板引擎
  • GStringTemplateEngine -将模板作为可写的闭包 (适用于流操作)
  • XmlTemplateEngine -适用于输出XML格式的模板引擎
  • MarkupTemplateEngine – 非常完整优化的模板引擎

3. SimpleTemplateEngine

SimpleTemplateEngine允许在模板中使用类似JSP风格的代码(如下例),脚本和EL表达式。样例


import groovy.text.SimpleTemplateEngine

def text = 'Dear "$firstname $lastname",\nSo nice to meet you in <% print city %>.\nSee you in ${month},\n${signed}'

def binding = ["firstname":"Sam", "lastname":"Pullara", "city":"San Francisco", "month":"December", "signed":"Groovy-Dev"]

def engine = new SimpleTemplateEngine()
template = engine.createTemplate(text).make(binding)

def result = 'Dear "Sam Pullara",\nSo nice to meet you in San Francisco.\nSee you in December,\nGroovy-Dev'

assert result == template.toString()


 

然而,通常在模板中混入业务逻辑不是良好的习惯。但是有时一些简单的逻辑是有用的。上述的例子中,我们可以修改一下:


$firstname


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


${firstname.capitalize()}

或者这样


<% print city %>


改为:


<% print city == "New York" ? "The Big Apple" : city %>


3.1.高级应用说明

如果直接将模板嵌入到脚本中(如我们上面做的那样),必须小心反斜杠转义。模板中的字符串在传入到模板框架之前需要Groovy解析,而GString表达式以及脚本代码作为Groovy程序的一部分,必须要转义反斜杠。例如,想用引号把 The Big Apple引起来,可以这样做:


<% print city == "New York" ? "\\"The Big Apple\\"" : city %>


相似的,如果想新起一行,我们可以这样用:


\\n


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


\\\\


在外部文件中:


\\\\


4.GStringTemplateEngine

使用GStringTemplateEngine的方法,和上述的例子有点类似(显示更多的参数)。首先,我们将模板存在文件中:

test.template


Dear "$firstname $lastname",
So nice to meet you in <% out << (city == "New York" ? "\\"The Big Apple\\"" : city) %>.
See you in ${month},
${signed}


注意:我们使用out替代print支持GStringTemplateEngine的流特性。因为我们将文件存储在单独的文件中,所以不需要转义反斜线。调用过程如下:


def f = new File('test.template')
engine = new GStringTemplateEngine()
template = engine.createTemplate(f).make(binding)
println template.toString()


输入结果如下:


Dear "Sam Pullara",
So nice to meet you in "The Big Apple".
See you in December,
Groovy-Dev


5. XmlTemplateEngine

XmlTemplateEngine适用于输入模板输出结果都是XML样式的场景。可以在模板的任意表达式中使用${expression} 和 $variable符号。同时也支持特殊的标签:<gsp:scriptlet> (用户插入代码片段) and <gsp:expression> (用于输入结果的代码片段).

注解和处理指令在处理的过程中会被移除,同时特殊的XML符号比如:<,>, " 和 '会被相应的XML符号转义。输出结果将按照标准的XML输出格式进行缩进。gsp:tags 定义的Xmlns命名空间会被移除但是其他的命名空间将会被保留(可能转换成XML树中等效的结果)。

正常情况下,模板原文件会保存在单独的文件中,但是下面的例子提供一个String类型的XML模板。


def binding = [firstname: 'Jochen', lastname: 'Theodorou', nickname: 'blackdrag', salutation: 'Dear']
def engine = new groovy.text.XmlTemplateEngine()
def text = '''\
 <document xmlns:gsp='http://groovy.codehaus.org/2005/gsp' xmlns:foo='baz' type='letter'>
 <gsp:scriptlet>def greeting = "${salutation}est"</gsp:scriptlet>
 <gsp:expression>greeting</gsp:expression>
 <foo:to>$firstname "$nickname" $lastname</foo:to>
 How are you today?
 </document>
'''
def template = engine.createTemplate(text).make(binding)
println template.toString()


输出结果如下:

<document type=’letter’> Dearest <foo:to xmlns:foo=’baz’> Jochen &quot;blackdrag&quot; Theodorou </foo:to> How are you today? </document>

6. The MarkupTemplateEngine

此模板引擎主要适用于生成XML风格类似的标记(XML, XHTML, HTML5, …),但是也可以用于生成任意文本。和传统的模板引擎不同的是,此模板引擎基于DSL。如下模板样例:


xmlDeclaration()
cars {
   cars.each {
       car(make: it.make, model: it.model)
   }
}


如果用下面的数据模型填充:


model = [cars: [new Car(make: 'Peugeot', model: '508'), new Car(make: 'Toyota', model: 'Prius')]]


渲染的结果:


<?xml version='1.0'?> <cars><car make='Peugeot' model='508'/><car make='Toyota' model='Prius'/></cars>


此模板引擎的主要特点:

  • 标记构建器风格的语法
  • 模板编译成字节代码
  • 渲染迅速
  • 可选择的模板数据类型校验
  • 包含
  • 国际化支持
  • 碎片化/布局
目录
相关文章
|
1月前
|
Python
配置模板引擎
【8月更文挑战第6天】配置模板引擎。
33 7
|
3月前
|
JavaScript 前端开发
JSf中ilter的使用方法
JSf中ilter的使用方法
|
XML Java Maven
探索Velocity模板引擎:灵活的模板生成工具
在现代的应用开发中,生成动态内容的需求非常常见。Velocity模板引擎作为一款灵活的模板生成工具,可以帮助我们将数据与模板结合,生成各种文本、HTML、XML等格式的内容。本文将深入探讨Velocity的基本概念、特点,以及如何在实际应用中使用它进行模板生成。
368 0
|
XML Java 程序员
模板引擎:第一章:FreeMarker
模板引擎:第一章:FreeMarker
185 0
模板引擎:第一章:FreeMarker
|
Java 程序员 Apache
模板引擎——FreeMarker初体验
FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。
|
Java Spring
常见的模版引擎
常见的模版引擎
74 0
symfony框架Twig模板语言的使用
symfony框架Twig模板语言的使用
143 0
symfony框架Twig模板语言的使用
|
前端开发 JavaScript Java
java前端模板Thymeleaf常用语法
java前端模板Thymeleaf常用语法
375 0
java前端模板Thymeleaf常用语法