2. 什么是 Groovy 的 TemplateEngine?
Groovy 的 TemplateEngine
是一个抽象类,定义了 createTemplate
方法。所有 Groovy 提供的模板引擎都继承自这个类,并实现 createTemplate
方法,返回一个 Template
接口实例。
Template
接口有一个 make
方法,接受一个 Map 类型的绑定变量参数。每个模板引擎都需要实现这个方法,以完成动态内容的生成。
接下来,我们将逐一介绍 Groovy 中常用的几种模板引擎及其使用场景。
3. SimpleTemplateEngine
SimpleTemplateEngine
是 Groovy 中最基础的模板引擎之一,它通过字符串插值和脚本片段(scriptlet)来生成动态文本,非常适合用于短信、简单邮件等场景。
✅ 示例代码:
def "testSimpleTemplateEngine"() {
given:
def smsTemplate = 'Dear <% print user %>, Thanks for reading our Article. ${signature}'
when:
def smsText = new SimpleTemplateEngine().createTemplate(smsTemplate).make(BIND_MAP)
then:
smsText.toString() == "Dear Norman, Thanks for reading our Article. Baeldung"
}
⚠️ 注意:SimpleTemplateEngine
在处理非常大的文本时性能不佳,建议用于小规模内容。
4. StreamingTemplateEngine
StreamingTemplateEngine
与 SimpleTemplateEngine
类似,但内部使用了 Writable
闭包来生成模板,更适合处理大于 64KB 的大文本内容。
✅ 模板文件示例(articleEmail.template):
Dear <% out << (user) %>,
Please read the requested article below.
<% out << (articleText) %>
From,
<% out << (signature) %>
✅ 使用代码:
def articleEmailTemplate = new File('src/main/resources/articleEmail.template')
def bindMap = [user: "Norman", signature: "Baeldung"]
bindMap.articleText = """1. Overview
This is a tutorial article on Template Engines...""" // 可以是大于 64K 的字符串
def articleEmailText = new StreamingTemplateEngine().createTemplate(articleEmailTemplate).make(bindMap)
assert articleEmailText.toString() == """Dear Norman,
Please read the requested article below.
1. Overview
This is a tutorial article on Template Engines...
From,
Baeldung"""
✅ 优点:处理大文本更高效,适合邮件正文、日志模板等场景。
5. GStringTemplateEngine
GStringTemplateEngine
使用 GString 语法来生成动态内容,支持变量插值(如 $user
)和表达式(如 ${signature}
)。
✅ 模板文件示例(email.template):
Dear $user,
Thanks for subscribing our services.
${signature}
✅ 使用代码:
def emailTemplate = new File('src/main/resources/email.template')
def emailText = new GStringTemplateEngine().createTemplate(emailTemplate).make(bindMap)
✅ 适用场景:适合结构简单、对性能要求不高的模板场景。
6. XmlTemplateEngine
当你需要生成动态 XML 内容时,XmlTemplateEngine
是理想选择。它支持 XML Schema,并允许使用 <gsp:scriptlet>
和 <gsp:expression>
标签嵌入脚本和表达式。
✅ XML 模板示例:
def emailXmlTemplate = '''
<xs xmlns:gsp='groovy-server-pages'>
<gsp:scriptlet>def emailContent = "Thanks for subscribing our services."</gsp:scriptlet>
<email>
<greet>Dear ${user}</greet>
<content><gsp:expression>emailContent</gsp:expression></content>
<signature>${signature}</signature>
</email>
</xs>'''
def emailXml = new XmlTemplateEngine().createTemplate(emailXmlTemplate).make(bindMap)
✅ 输出结果:
<xs>
<email>
<greet>
Dear Norman
</greet>
<content>
Thanks for subscribing our services.
</content>
<signature>
Baeldung
</signature>
</email>
</xs>
⚠️ 注意:输出的 XML 会自动缩进美化,适合用于生成结构清晰的 XML 数据。
7. MarkupTemplateEngine
MarkupTemplateEngine
是 Groovy 中功能最强大的模板引擎之一,专为生成 HTML、XML 等标记语言设计。它使用 DSL(领域特定语言)风格编写模板,性能也优于其他模板引擎。
7.1 HTML 示例
✅ HTML 模板示例:
def emailHtmlTemplate = """
html {
head {
title('Service Subscription Email')
}
body {
p('Dear Norman')
p('Thanks for subscribing our services.')
p('Baeldung')
}
}"""
def emailHtml = new MarkupTemplateEngine().createTemplate(emailHtmlTemplate).make()
✅ 输出 HTML:
<html><head><title>Service Subscription Email</title></head>
<body><p>Dear Norman</p><p>Thanks for subscribing our services.</p><p>Baeldung</p></body></html>
7.2 XML 示例
✅ XML 模板示例:
def emailXmlTemplate = """
xmlDeclaration()
xs{
email {
greet('Dear Norman')
content('Thanks for subscribing our services.')
signature('Baeldung')
}
}"""
def emailXml = new MarkupTemplateEngine().createTemplate(emailXmlTemplate).make()
✅ 输出 XML:
<?xml version='1.0'?>
<xs><email><greet>Dear Norman</greet><content>Thanks for subscribing our services.</content>
<signature>Baeldung</signature></email></xs>
7.3 配置选项
默认情况下,MarkupTemplateEngine
不会自动缩进或美化输出内容。可以通过 TemplateConfiguration
设置:
✅ 配置示例:
TemplateConfiguration config = new TemplateConfiguration()
config.autoIndent = true
config.autoEscape = true
config.autoNewLine = true
def templateEngine = new MarkupTemplateEngine(config)
7.4 国际化支持
MarkupTemplateEngine
支持国际化(i18n)。你可以为不同语言创建不同的模板文件,例如:
email.tpl
(默认)email_ja_JP.tpl
(日语)email_fr_FR.tpl
(法语)
然后通过设置 locale
来启用对应语言的模板:
✅ 启用国际化:
config.locale = Locale.JAPAN
✅ 优点:支持多语言、结构清晰、性能优秀,推荐用于生成 HTML 页面或 XML 文档。
8. 总结
Groovy 提供了多种模板引擎,每种都有其适用场景:
引擎名称 | 适用场景 | 特点说明 |
---|---|---|
SimpleTemplateEngine |
简单文本模板,如短信、邮件 | 简单易用,性能一般 |
StreamingTemplateEngine |
大文本模板,如长邮件正文 | 性能优于 Simple |
GStringTemplateEngine |
GString 风格模板 | 语法简洁,适合小规模内容 |
XmlTemplateEngine |
动态生成 XML | 支持 XML Schema |
MarkupTemplateEngine |
HTML/XML 等标记语言模板 | 功能最全,支持国际化、缩进美化 |
根据实际需求选择合适的模板引擎,可以大大提升开发效率和系统性能。在实际项目中,建议优先考虑 MarkupTemplateEngine
,尤其是在生成 HTML 页面或支持多语言的场景下。