Дерево страниц
Skip to end of metadata
Go to start of metadata

Основные правила

Метка в шаблоне

Метка в шаблоне обозначается ${…}. Метка заменяется значением выражения внутри фигурных скобок. Примеры: ${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>

Повторение элементов

Перебор контейнера двумя основными способами. 

Способ 1
<#--Перебираем каждое значение, и для каждого из них выполняется логика-->
<#list sequence as item>
    <!-- do something with ${item} -->
</#list>

<#--Или, когда мы хотим повторить Hash , получая доступ как к ключу, так и к значению -->
<#list hash as key, value>
    <!-- do something with ${key} and ${value} -->
</#list>
Способ 2
<#-- Позволяет определить логику, которая должна происходить на различных этапах итерации. Элемент представляет собой имя зацикленной переменной, 
но можно переименовать его по своему усмотрению --> 
<#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>
 контейнер ["200 OK", "404 Not Found", "500 Internal Server Error"] 
Результат
<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.

  1. Использовать теги попытки recover, чтобы определить, что мы должны попытаться выполнить, и блок кода, который должен выполниться в случае ошибки.

    Шаблон
    <#attempt>
        <!-- block to try -->
    <#recover>
        <!-- block to execute in case of exception -->
    </#attempt>

    Теги attempt и recover являются обязательными. В случае ошибки он откатывает предпринятый блок и выполняет только код в разделе recover.

  2. Настроить FreeMarker, что должно происходить в случае исключений.