Перейти к основному содержимому

Механизмы шаблонов в Groovy

· 5 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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 .