- Создатель Васильев Антон, отредактировано 29.12.2023
Основные правила
Метка в шаблоне
Метка в шаблоне обозначается ${…}. Метка заменяется значением выражения внутри фигурных скобок. Примеры: ${1 + 2}, ${variableName}
Теги
Теги FTL похожи на теги HTML (но содержат # или @ ), и FreeMarker интерпретирует их, например, <#if…></#if>
Комментарии
Комментарии в FreeMarker начинаются с <#– и заканчиваются -->
Статус | ГОТОВО |
---|---|
Раздел | 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>
Повторение элементов
Перебор контейнера двумя основными способами.
<#--Перебираем каждое значение, и для каждого из них выполняется логика--> <#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 для извлечения только значений.
Последовательность более сложная; можно сгруппировать наиболее полезные функции:
- chunk и join, чтобы получить подпоследовательность или объединить две последовательности
- reverse , sort и sortBy для изменения порядка элементов
- first и last извлекут первый или последний элемент соответственно
- size представляет количество элементов в последовательности
- seqContains , seqIndexOf или seqLastIndexOf для поиска элемента
Обработка типов
FreeMarker поставляется с огромным количеством разнообразных функций (встроенных), доступных для работы с объектами. Давайте посмотрим на некоторые часто используемые функции.
Обработка строк
- url и urlPath будут экранировать строку URL-адресом, за исключением того, что urlPath не будет экранировать косую черту /
- jString , jsString и jsonString будут применять правила экранирования для Java, Javascript и JSON соответственно .
- capFirst , uncapFirst , upperCase , lowerCase и capitalize полезны для изменения регистра строки, как следует из их названий.
- boolean , date , time , datetime и number - это функции для преобразования строки в другие типы.
Пример
<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>
Обработка чисел
- round , min и max могут помочь с округлением чисел
- abs вернет абсолютное значение числа
- string преобразует число в строку. Мы также можем передать четыре предопределенных числовых формата: компьютер , валюта , число или процент или определить свой собственный формат, например ["0.###"]
Пример
<p>${(7.3?round + 3.4?ceiling + 0.1234)?string('0.##')}</p> <#-- (7 + 4 + 0.1234) with 2 decimals -->
<p>11.12</p>
Обработка даты
- .now представляет текущую дату и время
- date , time и datetime могут возвращать разделы даты и времени объекта даты и времени.
- строка преобразует дату и время в строки - можно передать желаемый формат или использовать предопределенный
<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.
- Настроить FreeMarker, что должно происходить в случае исключений.