Справка FreeMarker

Опубликовано 2012.08.10

FreeMarker - это шаблонизатор, используемый совместо с языком программирования Java. Пользоваться им достаточно просто. В нём используются объекты, добавленные в него через метод контроллера, вызвавшего собственно ftl шаблон. Да, кстати, шаблоны имеют раширение ftl. Например ваш метод с именем renderPage использует шаблон с именем mypage.ftl Для этого пишем в контроллере: ModelAndView mav = request.getAttribute("mav"); mav.setViewName("mypage"); Готово, теперь при обращение к методу renderPage будет вызван шаблон mypage.ftl В начале шаблона должно стоять [#ftl] Далее можно писать всё что угодно. Для начала добавим в шаблон какой-нибудь объект, например строку. Пишем в методе: mav.addObject("name", "Developer name"); Теперь в шаблоне есть фримаркеровская переменная с именем name и значением Developer name. Выведем её:
  1. [#ftl]
  2. ${name}
Готово. Аналогично можно передать массив: mav.addObject("indexes",[1,4,5,2,12,41]); И в шаблоне написать такую конструкцию:
  1. [#assign count=indexes?size]
  2. [#list 0..count-1 as i]
  3. ${indexes[i]}<br />
  4. [/#list]
Значения нашего массива будут выведены в столбик. Если у вас хэш мап, то аналогично функцией list можно перебрать и его,вот так:
  1. [#assign keys = hash?keys]
  2. [#list keys as key]
  3. ${key} = ${hash[key]}<br />
  4. [/#list]
Где hash - собственно сам хэш мап. Обратите внимание,что при обходе хэш мапа, в цикле не поисходит приравнивания двух переменных.как может показаться на первый взгляд.Знак равенства-это чистый html. Всё что относится к FreeMarker - находится внутри {} или []. Для обращения к методам следует использовать знак вопроса. Например для превращения массива в строку напишем так:
  1. [#assign str=array?split()]
Да, конструкцией assign вы будете задавать и переопределять значения переменных. Переменные, созданные таким образом будут глобальными. Локальные, как вы наверняка знаете, нужны для функций. FreeMarker предусматривает функции и макросы. В чём разница-честно, незнаю... Напишем простой макрос,который выведет наше имя и возраст.
  1. [#macro my_macros name age]
  2. Вас зовут ${name} и вам всего-то ${age} лет.
  3. [#macro]
Готово. Вызов макроса будет происходить так:
  1. [@my_macros "Вася" 15][/@]
Грамотный программист поместит десятки своих макросов в отдельный файл, и правильно сделает. Во FreeMarker`е есть функции include и import. Работают они несколько по разному. предположим у нас есть файл macroses.ftl , содержащий в себе макросы.И его мы будем импортить в наш mypage.ftl . Напишем:
  1. [#import "macroses.ftl" as macs]
И далее дернем из него макрос my_macros:
  1. [@macs.my_macros "Отец Фёдор" 2012][/@]
Всё просто. Да,если вы проверите такой код, то заметите, что число 2012 отобразилось как 2 012. Кашерно? Иногда да,а иногда и нет. Если вам не нужна вся эта радость, то при отображении числовой переменной age используйте метод c. То есть
  1. [#macro my_macros name age]
  2. Вас зовут ${name} и вам всего-то ${age?c} лет.
  3. [#macro]
Теперь числа будут без пробелов. Условия. Автоматическое преобразование типов тут не хляет.. Такой код вызовет ошибку:
  1. [#assign ok="any string"]
  2. [#if ok]
  3. Привели к true.
  4. [/#if]
Тут или
  1. [#if ok=="any string"]
, или
  1. [#if ok??]
Два вопросительных знака приведут переменную к булевскому типу. А если по условию на существование переменной вы хотите её же и вывести, то очевидную конструкцию типа:
  1. [#if my_var??]
  2. ${my_var}
  3. [/#if]
Можно записать как:
  1. ${(my_var)!}
Круто. Ещё одна простая конструкция. По булевской переменной вывести либо одно слово, либо другое:
  1. [#assign any_boolean=true]
  2. ${any_boolean?string("Всё ок", "Ещё не готово")}
Ну и напоследок проверка нахождения переменной в массиве.
  1. [#assign colors = ["black", "red", "green", "silver", "gold"]]
  2. My gold: ${colors?seq_contains("gold")?string("is realy", "no-no-no...")}
Выведет "My gold: is realy" Вот собственно краткая справка. если интересно что-то ещё - пишите в комментариях, постараюсь помочь.