Метка в шаблоне обозначается ${…}. Метка заменяется значением выражения внутри фигурных скобок. Примеры: ${1 + 2}, ${variableName}
Теги FTL похожи на теги HTML (но содержат # или @ ), и FreeMarker интерпретирует их, например, <#if…></#if>
Комментарии в FreeMarker начинаются с <#– и заканчиваются -->
|
Оператор | Описание |
---|---|
?? | Проверить существует ли атрибут или вложенное свойство |
?c | Преобразовать логическое значение в удобочитаемую строку |
! | Значение по умолчанию, если атрибут не существует |
() | Проверить существует ли атрибут и имеет ли он вложенное свойство с другим вложенным свойством |
Пример
<p>Testing is student property exists: ${student???c}</p> <p>Using default value for missing student: ${student!'John Doe'}</p> <p>Wrapping student nested properties: ${(student.address.street)???c}</p> |
<p>Testing is student property exists: false</p> <p>Using default value for missing student: John Doe</p> <p>Wrapping student nested properties: false</p> |
Управляющие структуры присутствуют во FreeMarker, и традиционный if-else
<#if condition> <!-- block to execute if condition is true --> <#elseif condition2> <!-- block to execute if condition2 is the first true condition --> <#elseif condition3> <!-- block to execute if condition3 is the first true condition --> <#else> <!-- block to execute if no condition is true --> </#if> |
Пример
<#if status??> <p>${status.reason}</p> <#else> <p>Missing status!</p> </#if> |
<!-- When status attribute exists --> <p>404 Not Found</p> <!-- When status attribute is missing --> <p>Missing status!</p> |
Контейнеры подпеременных
Во FreeMarker есть три типа контейнеров для подпеременных:
Перебор контейнера двумя основными способами.
<#--Перебираем каждое значение, и для каждого из них выполняется логика--> <#list sequence as item> <!-- do something with ${item} --> </#list> <#--Или, когда мы хотим повторить Hash , получая доступ как к ключу, так и к значению --> <#list hash as key, value> <!-- do something with ${key} and ${value} --> </#list> |
<#-- Позволяет определить логику, которая должна происходить на различных этапах итерации. Элемент представляет собой имя зацикленной переменной, но можно переименовать его по своему усмотрению --> <#list sequence> <!-- one-time logic if the sequence is not empty --> <#items as item> <!-- logic repeated for every item in sequence --> </#items> <!-- one-time logic if the sequence is not empty --> <#else> <!-- one-time logic if the sequence is empty --> </#list> |
Пример
<#list statuses> <ul> <#items as status> <li>${status}</li> </#items> </ul> <#else> <p>No statuses available</p> </#list> |
<ul> <li>200 OK</li> <li>404 Not Found</li> <li>500 Internal Server Error</li> </ul> |
Хэш позволяет выполнять две простые функции: keys для извлечения только содержащихся ключей и values для извлечения только значений.
Последовательность более сложная; можно сгруппировать наиболее полезные функции:
FreeMarker поставляется с огромным количеством разнообразных функций (встроенных), доступных для работы с объектами. Давайте посмотрим на некоторые часто используемые функции.
Пример
<p>${'http://myurl.com/?search=Hello World'?urlPath}</p> <p>${'Using " in text'?jsString}</p> <p>${'my value?upperCase}</p> <p>${'2019-01-12'?date('yyyy-MM-dd')}</p> |
<p>http%3A//myurl.com/%3Fsearch%3DHello%20World</p> <p>MY VALUE</p> <p>Using \" in text</p> <p>12.01.2019</p> |
Пример
<p>${(7.3?round + 3.4?ceiling + 0.1234)?string('0.##')}</p> <#-- (7 + 4 + 0.1234) with 2 decimals --> |
<p>11.12</p> |
<p>${.now?time?string('HH:mm')}</p> |
<p>15:39</p> |
Два способа обработки исключений для шаблона FreeMarker.
Использовать теги попытки recover, чтобы определить, что мы должны попытаться выполнить, и блок кода, который должен выполниться в случае ошибки.
<#attempt> <!-- block to try --> <#recover> <!-- block to execute in case of exception --> </#attempt> |
Теги attempt и recover являются обязательными. В случае ошибки он откатывает предпринятый блок и выполняет только код в разделе recover.