Groovy 中模板简介
1. 概述
在本入门教程中,我们将探讨Groovy 中模板引擎的概念。
在 Groovy 中,我们可以使用GString 轻松生成动态文本。但是,模板引擎提供了一种使用静态模板处理动态文本的更好方法。
这些模板可以方便地为各种通知(如 SMS 和电子邮件)定义静态模板。
2. Groovy 的TemplateEngine是什么?
Groovy 的TemplateEngine是一个包含createTemplate方法的抽象类。
Groovy 中可用的所有模板框架引擎都扩展了TemplateEngine并实现了createTemplate。此外,每个引擎都返回Template接口对象。
**Template接口有一个make方法,它采用映射来绑定变量。**因此,它必须由每个模板框架实现。
让我们讨论一下 Groovy 中所有可用模板框架的功能和行为。
3. SimpleTemplateEngine
SimpleTemplateEngine使用字符串插值和小脚本生成动态文本。该引擎对于简单的通知(例如 SMS 和简单的文本电子邮件)非常有用。 例如:
def smsTemplate = 'Dear <% print user %>, Thanks for reading our Article. ${signature}'
def bindMap = [user: "Norman", signature: "Blogdemo"]
def smsText = new SimpleTemplateEngine().createTemplate(smsTemplate).make(bindMap)
assert smsText.toString() == "Dear Norman, Thanks for reading our Article. Blogdemo"
4. StreamingTemplateEngine
在一般意义上,StreamingTemplateEngine 的工作方式类似于SimpleTemplateEngine。但是,它在内部使用Writable 闭包来生成模板。
出于同样的原因,它在处理更大的字符串(> 64K)时也有好处。因此,它比SimpleTemplateEngine 更高效。
让我们写一个简单的例子来使用静态模板生成动态电子邮件内容。
首先,我们将创建一个静态articleEmail模板:
Dear <% out << (user) %>,
Please read the requested article below.
<% out << (articleText) %>
From,
<% out << (signature) %>
在这里,我们将*<% %>*脚本用于动态文本并用于编写器。
现在,我们将使用StreamingTemplateEngine生成电子邮件的内容:
def articleEmailTemplate = new File('src/main/resources/articleEmail.template')
def bindMap = [user: "Norman", signature: "Blogdemo"]
bindMap.articleText = """1. Overview
This is a tutorial article on Template Engines...""" //can be a string larger than 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,
Blogdemo"""
5. GStringTemplateEngine
顾名思义,GStringTemplateEngine使用GString从静态模板生成动态文本。
首先,让我们使用*GString编写一个简单的**email *模板:
Dear $user,
Thanks for subscribing our services.
${signature}
现在,我们将使用GStringTemplateEngine来创建动态内容:
def emailTemplate = new File('src/main/resources/email.template')
def emailText = new GStringTemplateEngine().createTemplate(emailTemplate).make(bindMap)
6. XmlTemplateEngine
当我们想要创建动态 XML 输出时,XmlTemplateEngine很有用。它需要 XML 模式作为输入并允许两个特殊标记,<gsp:scriptlet>用于注入脚本,<gsp:expression>用于注入表达式。
例如,让我们将已经讨论过的*email *模板转换为 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)
因此,emailXml将呈现 XML,内容为:
<xs>
<email>
<greet>
Dear Norman
</greet>
<content>
Thanks for subscribing our services.
</content>
<signature>
Blogdemo
</signature>
</email>
</xs>
有趣的是,模板框架对 XML 输出进行了缩进和美化。
7. MarkupTemplateEngine
这个模板框架是一个完整的包,用于生成 HTML 和其他标记语言。
此外,它使用领域特定语言来处理模板,并且是 Groovy 中可用的所有模板框架中最优化的。
7.1. HTML
让我们写一个简单的例子来为已经讨论过的电子邮件模板呈现 HTML:
def emailHtmlTemplate = """
html {
head {
title('Service Subscription Email')
}
body {
p('Dear Norman')
p('Thanks for subscribing our services.')
p('Blogdemo')
}
}"""
def emailHtml = new MarkupTemplateEngine().createTemplate(emailHtmlTemplate).make()
因此, emailHtml的内容将是:
<html><head><title>Service Subscription Email</title></head>
<body><p>Dear Norman</p><p>Thanks for subscribing our services.</p><p>Blogdemo</p></body></html>
7.2. XML
同样,我们可以呈现 XML:
def emailXmlTemplate = """
xmlDeclaration()
xs{
email {
greet('Dear Norman')
content('Thanks for subscribing our services.')
signature('Blogdemo')
}
}"""
def emailXml = new MarkupTemplateEngine().createTemplate(emailXmlTemplate).make()
因此, emailXml的内容将是:
<?xml version='1.0'?>
<xs><email><greet>Dear Norman</greet><content>Thanks for subscribing our services.</content>
<signature>Blogdemo</signature></email></xs>
7.3. TemplateConfiguration
请注意,与XmlTemplateEngine不同,此框架的模板输出不会自行缩进和美化。
对于这样的配置,我们将使用TemplateConfiguration类:
TemplateConfiguration config = new TemplateConfiguration()
config.autoIndent = true
config.autoEscape = true
config.autoNewLine = true
def templateEngine = new MarkupTemplateEngine(config)
7.4. 国际化
此外,TemplateConfiguration的locale属性可用于启用国际化支持。
首先,我们将创建一个静态模板文件email.tpl并将已经讨论过的emailHtmlTemplate字符串复制到其中。这将被视为默认模板。
同样,我们将创建基于语言环境的模板文件,例如日语的email_ja_JP.tpl、法语的 email_fr_FR.tpl 等。
最后,我们只需要在TemplateConfiguration对象中设置语言环境:
config.locale = Locale.JAPAN
因此,将选择相应的基于语言环境的模板。