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

Материал из DOM

Перейти к: навигация, поиск

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

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

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

Сначала подготовительные действия: нужно создать объект Инструмент, выполнить его настройку и поместить внутрь контекста. Важно: когда мы будем внутри Velocity-шаблона использовать методы Инструмента, подавая им на вход строковое представление некоторых дат, то оно должно полностью соответствовать формату и локали указанным здесь, на стадии конфигурирования Инструмента:

ComparisonDateTool date = new ComparisonDateTool();
Map date_props = new HashMap ();
date_props.put ("locale", Locale.getDefault ());
date_props.put ("format", "yyyy-MM-dd");
date.configure(date_props);
vc.put ("date", date);

Теперь пример использования:

$date ||2008-04-02 ||Выводится текущая дата
Код VTL Результат Пояснение
$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).

Сначала подготовительные меры, кладем в контекст объект Инструмента:

MathTool math = new MathTool();
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 механизмом форматирования чисел).

Сначала подготовительные действия, во время которых необходимо указать правила форматирования чисел:

NumberTool number = new NumberTool();
        Map number_props = new HashMap ();
        number_props.put ("format", "#,##0.##");
        number.configure(number_props);
        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

А теперь код создающий Инструмент и указывающий то, какой ресурсный файл использовать:

ResourceTool i10n = new ResourceTool();
        Map i10n_props = new HashMap ();
        i10n_props.put ("locale", Locale.getDefault ());
        i10n_props.put ("bundles", "testi.messages");
        i10n.configure(i10n_props);
        vc.put ("i10n", i10n);

7. ListTool – служит для унификации работы с массивами и коллекциями в VTL. Подготовительные действия:

ListTool list = new ListTool();
        vc.put ("list", list);

Теперь создам массив и список строк, помещу их в контекст:

String[] _array = {"apple", "orange", "grapes"};
vc.put("_array", _array);
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-ов для всех свойств по которым выполняется сортировка.

public class User {
    public String fio;
    public Integer age;
    User(String fio, Integer age) {
        this.fio = fio;
        this.age = age;
    }
    public String getFio() {
        return fio;
    }
 
    public void setFio(String fio) {
        this.fio = fio;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
}

В коде приложения я создам массив объектов User и помещу их в контекст Velocity:

User[] users = {
  new User("Вася", 10), new User("Петя", 11), new User("Ленка", 12),
};
vc.put("users", users);

Теперь пример использования:

## сортировка на основании одного свойства
#foreach($user in $sort.sort($users, "fio"))
   $user.fio - $user.age
#end
 
 
## сортировка на основании списка свойств: сначала сортируем по age, а затем по fio
#foreach($user in $sort.sort($users, ["age", "fio"]))
   $user.fio - $user.age
#end
 
## для каждого из полей по которому выполняется сортировка можно задать направление
#foreach($user in $sort.sort($users, ["age:desc", "fio:asc"]))
  $user.fio - $user.age
#end

9. Еще несколько инструментов, увы, не слишком полезных.

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


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

Subscribe Now!

 

ObMachine projects & articles (java, flash, flex, php, ...)  -- black-zorro.com