Шаблоны на java с помощью Velocity. Часть 2

January 19, 2009Comments Off on Шаблоны на java с помощью Velocity. Часть 2

В состав Velocity входит VelocityTools набор стандартизированных (понарошку) классов-инструментов. Мы можем положить их внутрь контекста Velocity и использовать при необходимости. Вот перечень таких инструментов:

1. ComparisonDateTool - представляет средства для сравнения дат, поиска разницы между датами, плюс, средства для преобразования даты в строку с различными правилами форматирования.

Вот небольшой пример использования:

Сначала подготовительные действия: нужно создать объект Инструмент, выполнить его настройку и поместить внутрь контекста. Важно: когда мы будем внутри Velocity-шаблона использовать методы Инструмента, подавая им на вход строковое представление некоторых дат, то оно должно полностью соответствовать формату и локали указанным здесь, на стадии конфигурирования Инструмента:
  1. ComparisonDateTool date = new ComparisonDateTool();
  2. Map date_props = new HashMap ();
  3. date_props.put ("locale", Locale.getDefault ());
  4. date_props.put ("format", "yyyy-MM-dd");
  5. date.configure(date_props);
  6. vc.put ("date", date);
Теперь пример использования:
Код VTL Результат Пояснение
$date 2008-04-02 Выводится текущая дата
$date.whenIs('2009-05-03') 1 year away Через сколько лет от текущего момента наступит дата, переданная как параметр методу whenIs.
$date.whenIs('2009-05-03').days 395 То же что и в предыдущем варианте, но выводится количество дней до наступления некоторой даты.
$date.whenIs('2009-05-03').full 1 year 1 month 8 hours 56 minutes 11 seconds 907 milliseconds away А так мы выводим полную информацию о сроке до наступления некоторой даты.
$date.difference('2009-05-03',$date).full -1 year 1 month 1 day Разница между двумя датами.
$date.difference('2009-05-03',$date.calendar).full -1 year 1 month 8 hours 49 minutes 24 seconds 266 milliseconds Тоже разница между двумя датами, но обратите внимание на точность. В прошлый раз учитывались только те компоненты date, которые были указаны в форматирующей строке, сейчас же все.
2. MathTool – содержит несколько математических функций (функций мало, так что лучше положить в контекст стандартный для java объект Math).

Сначала подготовительные меры, кладем в контекст объект Инструмента:
  1. MathTool math = new MathTool();
  2. vc.put ("math", math);
А теперь примеры использования:
Код VTL Результат Пояснение
$math.max(10, 20) 20 Максимальное, минимальное значение.
$math.pow(10, 2) 100 Возводим число в степень.
$math.abs(-67.34) 67.34 Значение числа по-модулю.
$math.roundTo(3, -34.23444) -34.234 Округление до заданного числа знаков.
$math.round(-34234.2342) -34234 Округление до целых.
$math.getRandom() 0.511494104 Случайное число от 0 до 1.
$math.random(10, 20) 15 Случайное число в заданном отрезке.
3. NumberTool – форматирование чисел (по-сути, этот класс является надстройкой над стандартным для java механизмом форматирования чисел).

Сначала подготовительные действия, во время которых необходимо указать правила форматирования чисел:
  1. NumberTool number = new NumberTool();
  2.         Map number_props = new HashMap ();
  3.         number_props.put ("format", "#,##0.##");
  4.         number.configure(number_props);
  5.         vc.put ("number", number);
А теперь примеры использования:
Код VTL Результат Пояснение
$number.format(237783.3477758) 237 783,35 Форматирование с настройками по-умолчанию.
$number.format("# ##0.##", 233.3434) 233 Явно задана строка форматирования. Но этот вариант лучше не использовать.
$number.integer(233.34) 233 Форматирование числа как целого.
$number.currency(233.34) 233,34 руб. Форматирование числа как денежной единицы.
Надо сказать, что в коде VTL есть небольшой баг: передача как параметр некоторой функции строки содержащей запятую иногда приводит к ее обрезанию.

4. RenderTool - позволяет внутри шаблона VTL динамически вычислить некоторую формулу (формула – это произвольная строковая переменная).

5. EscapeTool - позволяет при выводе текста отформатировать его, например, заменив все спец. символы на их коды (по правилам html, javascript и т.д.).

6. ResourceTool – очень полезный инструмент при разработке сайтов поддерживающий интернализацию (i18n) и локализацию (i10n).

Является точкой доступа из шаблонов Velocity к стандартным для java механизмам обеспечения i18n и i10n с помощью ResourceBundles.

Сначала подготовительные действия, обратите внимание на то, что я указываю базисное имя ресурса “testi.messages”. Поэтому я должен создать текстовый файл с именем “ messages.properties” и поместить его внутрь пакета “testi”:
MSG_1=Hello
MSG_2=By
А теперь код создающий Инструмент и указывающий то, какой ресурсный файл использовать:
  1. ResourceTool i10n = new ResourceTool();
  2. Map i10n_props = new HashMap ();
  3. i10n_props.put ("locale", Locale.getDefault ());
  4. i10n_props.put ("bundles", "testi.messages");
  5. i10n.configure(i10n_props);
  6. vc.put ("i10n", i10n);
7. ListTool – служит для унификации работы с массивами и коллекциями в VTL.

Подготовительные действия:
  1. ListTool list = new ListTool();
  2.         vc.put ("list", list);
Теперь создам массив и список строк, помещу их в контекст:
  1. String[] _array = {"apple", "orange", "grapes"};
  2. vc.put("_array", _array);
  3. vc.put("_list", Arrays.asList(_array));
Теперь пример использования ListTool (важно, что хотя я во всех примерах использую объект _array, но точно также я могу использовать и переменную _list):
Код VTL Результат Пояснение
$list.size($_array) 3 Количество элементов массива, списка.
$list.get($_array, 2) Grapes Получение элемента под номером 2.
$list.set($_array, 2, "potatoes") Изменяем значение элемента списка.
$list.isEmpty($_array) False Проверка списка на пустоту.
$list.contains($_array, "apple") True Проверка того, что список содержит элемент “apple”.
8. SortTool – служит для сортировок массивов или списков.

Сначала я модифицирую класс User, еще одно поле возраст – age. Обратите внимание, что для каждого из свойств age или fio я создал два метода getter и setter. Дело в том, что хотя я ранее говорил о том, что Velocity умеет обращаться к свойства объекта напрямую даже если не заданы getter-ы этих свойств, но код класса сортировки так не умеет и требует наличие getter-ов для всех свойств по которым выполняется сортировка.
  1. public class User {
  2.  
  3.     public String fio;
  4.     public Integer age;
  5.  
  6.     User(String fio, Integer age) {
  7.         this.fio = fio;
  8.         this.age = age;
  9.     }
  10.  
  11.     public String getFio() {
  12.         return fio;
  13.     }
  14.  
  15.     public void setFio(String fio) {
  16.         this.fio = fio;
  17.     }
  18.  
  19.     public Integer getAge() {
  20.         return age;
  21.     }
  22.  
  23.     public void setAge(Integer age) {
  24.         this.age = age;
  25.     }
  26. }
В коде приложения я создам массив объектов User и помещу их в контекст Velocity:
  1. User[] users = {
  2.   new User("Вася", 10), new User("Петя", 11), new User("Ленка", 12),
  3. };
  4. vc.put("users", users);
Теперь пример использования:
  1. ## сортировка на основании одного свойства
  2. #foreach($user in $sort.sort($users, "fio"))
  3.    $user.fio - $user.age
  4. #end
  5.  
  6.  
  7. ## сортировка на основании списка свойств: сначала сортируем по age, а затем по fio
  8. #foreach($user in $sort.sort($users, ["age", "fio"]))
  9.    $user.fio - $user.age
  10. #end
  11.  
  12. ## для каждого из полей по которому выполняется сортировка можно задать направление
  13. #foreach($user in $sort.sort($users, ["age:desc", "fio:asc"]))
  14.   $user.fio - $user.age
  15. #end
9. Еще несколько инструментов, увы, не слишком полезных.

Надо сказать, что для некоторых Tools перечисленных выше желательно указать настройки перед их использованием. Их можно либо явно в java-коде присвоить объектам, перед тем как положить объекты-инструменты в контекст или, второй вариант, использовать Toolbox. Здесь предполагается создание специального конфигурационного xml-файла, который будет прочитан Velocty, на основании этого файла автоматически будут созданы и объекты Инструментов, затем они будут “настроены” параметрами, взятыми из того же файла. И, последний шаг, полностью готовые Инструменты будут помещены внутрь контекста.

Может быть Вам еще понравится статья Velocity Фильтр

Categories: Java