«1. Обзор

В этом вводном руководстве мы рассмотрим концепцию шаблонизаторов в Groovy.

В Groovy мы можем использовать GStrings для простого создания динамического текста. Однако механизмы шаблонов обеспечивают лучший способ обработки динамического текста с использованием статических шаблонов.

Эти шаблоны удобны для определения статических шаблонов для различных уведомлений, таких как SMS и электронные письма.

2. Что такое TemplateEngine Groovy?

Groovy TemplateEngine — это абстрактный класс, содержащий метод createTemplate.

Все движки платформы шаблонов, доступные в Groovy, расширяют TemplateEngine и реализуют createTemplate. Кроме того, каждый движок возвращает объект интерфейса Template.

В интерфейсе шаблона есть метод make, который принимает карту для связывания переменных. Следовательно, он должен быть реализован каждой структурой шаблонов.

Давайте обсудим функциональность и поведение всех доступных фреймворков шаблонов в Groovy.

3. SimpleTemplateEngine

SimpleTemplateEngine генерирует динамический текст, используя интерполяцию строк и скриптлеты. Этот движок весьма полезен для простых уведомлений, таких как SMS и простые текстовые электронные письма.

Например:

def smsTemplate = 'Dear <% print user %>, Thanks for reading our Article. ${signature}'
def bindMap = [user: "Norman", signature: "Baeldung"]
def smsText = new SimpleTemplateEngine().createTemplate(smsTemplate).make(bindMap)

assert smsText.toString() == "Dear Norman, Thanks for reading our Article. Baeldung"

4. StreamingTemplateEngine

В общем смысле StreamingTemplateEngine работает аналогично SimpleTemplateEngine. Однако внутри он использует замыкания Writable для создания шаблона.

По той же причине он имеет преимущества при работе с большими строками (\u003e 64 КБ). Следовательно, он более эффективен, чем SimpleTemplateEngine.

Давайте напишем быстрый пример для создания динамического содержимого электронной почты с использованием статического шаблона.

Во-первых, мы создадим статический шаблон articleEmail:

Dear <% out << (user) %>,
Please read the requested article below.
<% out << (articleText) %>
From,
<% out << (signature) %>

Здесь мы используем скриптлеты \u003c% %\u003e для динамического текста и для автора.

Теперь сгенерируем содержимое электронной почты с помощью StreamingTemplateEngine:

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...""" //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,
Baeldung"""

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-схемы в качестве входных данных и позволяет использовать два специальных тега: \u003cgsp:scriptlet\u003e для вставки скрипта и \u003cgsp:expression\u003e для вставки выражения.

Например, давайте преобразуем уже обсуждавшийся шаблон электронной почты в 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>
      Baeldung
    </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('Baeldung')
    }
}"""
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>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()

Таким образом, содержимое emailXml будет:

<?xml version='1.0'?>
<xs><email><greet>Dear Norman</greet><content>Thanks for subscribing our services.</content>
<signature>Baeldung</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 позволяет включить поддержку интернационализации.

Во-первых, мы создадим файл статического шаблона email.tpl и скопируем в него уже обсуждавшуюся строку emailHtmlTemplate. Это будет рассматриваться как шаблон по умолчанию.

Точно так же мы создадим файлы шаблонов на основе локали, такие как email_ja_JP.tpl для японского языка, email_fr_FR.tpl для французского и т. д.

Наконец, все, что нам нужно, это установить локаль в объекте TemplateConfiguration:

config.locale = Locale.JAPAN

«

«Следовательно, будет выбран соответствующий шаблон на основе локали.

8. Заключение

В этой статье мы рассмотрели различные структуры шаблонов, доступные в Groovy.

Мы можем использовать эти удобные механизмы шаблонов для создания динамического текста с использованием статических шаблонов. Поэтому они могут быть полезны при динамической генерации различного рода уведомлений или экранных сообщений и ошибок.