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

StreamingTemplateEngineSimpleTemplateEngine 类似,但内部使用了 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 页面或支持多语言的场景下。