1. Обзор
В этом вводном руководстве мы рассмотрим концепцию механизмов шаблонов в Groovy .
В Groovy мы можем использовать GString
для простого создания динамического текста. Однако механизмы шаблонов обеспечивают лучший способ обработки динамического текста с помощью статических шаблонов.
Эти шаблоны удобны для определения статических шаблонов для различных уведомлений, таких как SMS и электронные письма.
2. Что такое TemplateEngine
Groovy ?
**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: "ForEach"]
def smsText = new SimpleTemplateEngine().createTemplate(smsTemplate).make(bindMap)
assert smsText.toString() == "Dear Norman, Thanks for reading our Article. ForEach"
4. StreamingTemplateEngine
В общем смысле StreamingTemplateEngine
работает аналогично SimpleTemplateEngine.
Однако внутри он использует замыкания Writable
для создания шаблона.
По той же причине он имеет преимущества при работе с большими строками (> 64 КБ). Следовательно, он более эффективен, чем 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: "ForEach"]
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,
ForEach"""
5. GStringTemplateEngine
Как следует из названия, GStringTemplateEngine
использует GString
для создания динамического текста из статических шаблонов.
Во-первых, давайте напишем простой шаблон электронной почты
, используя GString
:
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
XmlTemplateEngine полезен
, когда мы хотим создать динамические выходные данные XML. Он требует XML-схемы в качестве входных данных и позволяет использовать два специальных тега: <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)
Следовательно, emailXml
будет отображать XML, а содержимое будет:
<xs>
<email>
<greet>
Dear Norman
</greet>
<content>
Thanks for subscribing our services.
</content>
<signature>
ForEach
</signature>
</email>
</xs>
Интересно отметить, что выходные данные XML имеют отступы и украшаются структурой шаблона.
7. Механизм разметки шаблонов
Эта структура шаблонов представляет собой полный пакет для создания 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('ForEach')
}
}"""
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>ForEach</p></body></html>
7.2. XML
Точно так же мы можем отображать XML:
def emailXmlTemplate = """
xmlDeclaration()
xs{
email {
greet('Dear Norman')
content('Thanks for subscribing our services.')
signature('ForEach')
}
}"""
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>ForEach</signature></email></xs>
7.3. Конфигурация шаблона
Обратите внимание, что в отличие от XmlTemplateEngine
выходные данные шаблона этой платформы не имеют отступов и не украшаются сами по себе.
Для такой конфигурации мы будем использовать класс TemplateConfiguration :
TemplateConfiguration config = new TemplateConfiguration()
config.autoIndent = true
config.autoEscape = true
config.autoNewLine = true
def templateEngine = new MarkupTemplateEngine(config)
7.4. Интернационализация
Кроме того, доступно свойство языкового стандарта
TemplateConfiguration
, позволяющее включить поддержку интернационализации.
Во- первых, мы создадим файл статического шаблона email.tpl
и скопируем в него уже обсуждавшуюся строку emailHtmlTemplate
. Это будет рассматриваться как шаблон по умолчанию.
Точно так же мы создадим файлы шаблонов на основе локали, такие как email_ja_JP.tpl
для японского языка, email_fr_FR.tpl для французского и т. д.
Наконец, все, что нам нужно, это установить локаль
в объекте TemplateConfiguration :
config.locale = Locale.JAPAN
Следовательно, будет выбран соответствующий шаблон на основе локали.
8. Заключение
В этой статье мы рассмотрели различные платформы шаблонов, доступные в Groovy.
Мы можем использовать эти удобные механизмы шаблонов для создания динамического текста с использованием статических шаблонов. Поэтому они могут быть полезны при динамической генерации различного рода уведомлений или экранных сообщений и ошибок.
Как обычно, реализации кода этого руководства доступны в проекте GitHub .