MSG_1=Hello MSG_2=By
« Шаблоны на java с помощью Velocity. Часть 1 | Сложные интерфейсы на javascript вместе Yahoo UI. Часть 16 » |
Шаблоны на java с помощью Velocity. Часть 2
В состав 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);
Код 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, которые были указаны в форматирующей строке, сейчас же все. |
Сначала подготовительные меры, кладем в контекст объект Инструмента:
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 | Случайное число в заданном отрезке. |
Сначала подготовительные действия, во время которых необходимо указать правила форматирования чисел:
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 руб. | Форматирование числа как денежной единицы. |
4. RenderTool - позволяет внутри шаблона VTL динамически вычислить некоторую формулу (формула – это произвольная строковая переменная).
5. EscapeTool - позволяет при выводе текста отформатировать его, например, заменив все спец. символы на их коды (по правилам html, javascript и т.д.).
6. ResourceTool – очень полезный инструмент при разработке сайтов поддерживающий интернализацию (i18n) и локализацию (i10n).
Является точкой доступа из шаблонов Velocity к стандартным для java механизмам обеспечения i18n и i10n с помощью ResourceBundles.
Сначала подготовительные действия, обратите внимание на то, что я указываю базисное имя ресурса “testi.messages”. Поэтому я должен создать текстовый файл с именем “ messages.properties” и поместить его внутрь пакета “testi”:
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);
Подготовительные действия:
ListTool list = new ListTool();
vc.put ("list", list);
String[] _array = {"apple", "orange", "grapes"};
vc.put("_array", _array);
vc.put("_list", Arrays.asList(_array));
Код 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”. |
Сначала я модифицирую класс 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[] 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
Надо сказать, что для некоторых Tools перечисленных выше желательно указать настройки перед их использованием. Их можно либо явно в java-коде присвоить объектам, перед тем как положить объекты-инструменты в контекст или, второй вариант, использовать Toolbox. Здесь предполагается создание специального конфигурационного xml-файла, который будет прочитан Velocty, на основании этого файла автоматически будут созданы и объекты Инструментов, затем они будут “настроены” параметрами, взятыми из того же файла. И, последний шаг, полностью готовые Инструменты будут помещены внутрь контекста.
Может быть Вам еще понравится статья Velocity Фильтр
« Шаблоны на java с помощью Velocity. Часть 1 | Сложные интерфейсы на javascript вместе Yahoo UI. Часть 16 » |