Шаблонни двигатели в Groovy

1. Общ преглед

В този уводен урок ще разгледаме концепцията за механизмите за шаблони в Groovy.

В Groovy можем да използваме GString s, за да генерираме лесно динамичен текст. Двигателите на шаблони обаче осигуряват по-добър начин за обработка на динамичен текст с помощта на статични шаблони.

Тези шаблони са удобни при дефинирането на статични шаблони за различни известия като SMS и имейли.

2. Какво представлява TemplateEngine на Groovy ?

TemplateEngine на Groovy е абстрактен клас, който съдържа метода createTemplate .

Всички механизми за рамки на шаблони, налични в Groovy, разширяват TemplateEngine и прилагат createTemplate. Освен това всеки механизъм връща обекта на интерфейс на шаблон .

Интерфейсът на шаблона има метод make , който взема карта за свързване на променливи. Следователно тя трябва да бъде приложена от всяка рамка на шаблон.

Нека обсъдим функционалността и поведението на всички налични рамкови шаблони в Groovy.

3. SimpleTemplateEngine

В SimpleTemplateEngine генерира динамично текст с помощта String интерполация и scriptlets. Този механизъм е доста полезен за прости известия като SMS и прости текстови имейли.

Например:

def smsTemplate = 'Dear , 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. Вътрешно обаче той използва затварящи се записи , за да генерира шаблон.

По същата причина той носи предимства при работа над по-големи струни (> 64K). Следователно, той е по-ефективен от SimpleTemplateEngine.

Нека напишем бърз пример за генериране на динамично имейл съдържание, използвайки статичен шаблон.

Първо, ще създадем статичен шаблон ArticleEmail :

Dear <% out <, Please read the requested article below. <% out < From, <% out <

Тук използваме scriptlets за динамичен текст и извън за писателя.

Сега ще генерираме съдържанието на имейл с помощта на 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 схема като вход и позволява два специални маркера, да инжектирате скрипт и да инжектира израз.

Например, нека преобразуваме вече обсъждания шаблон за имейл в XML:

def emailXmlTemplate = ''' def emailContent = "Thanks for subscribing our services." Dear ${user} emailContent ${signature} ''' def emailXml = new XmlTemplateEngine().createTemplate(emailXmlTemplate).make(bindMap)

Следователно emailXml ще има XML, и съдържанието ще бъде:

 Dear Norman Thanks for subscribing our services. Baeldung 

Интересно е да се отбележи, че изходът на XML е отстъпен и се разкрасява от рамката на шаблона.

7. MarkupTemplateEngine

Тази рамка на шаблон е пълен пакет за генериране на HTML и други езици за маркиране.

Освен това той използва Domain Specific Language за обработка на шаблоните и е най-оптимизиран сред всички рамки на шаблони, налични в 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 ще бъде:

Service Subscription Email 

Dear Norman

Thanks for subscribing our services.

Baeldung

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 ще бъде:

 Dear NormanThanks for subscribing our services. Baeldung

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.

Можем да използваме тези удобни механизми за шаблони, за да генерираме динамичен текст, използвайки статични шаблони. Следователно те могат да бъдат полезни при динамичното генериране на различни видове известия или съобщения и грешки на екрана.

Както обикновено, реализациите на кода на този урок са достъпни в проекта GitHub.