Так уж получается, что мне на работе приходится заниматься не только JavaScript, SVG и тому подобными вещами. Недели три назад я узнал, что существует шаблонизатор предназначенный для использования в среде Java. Называется этот язык шаблонов весьма оригинально: Velocity. Раньше я думал, что со всеми популярными движками шаблонов мне довелось поработать или как минимум что-то о них слышать. Оказывается, есть еще поля по которым нужно пройтись!
Естественно, останавливаться на использовании шаблонов Velocity только в рамках проекта мне не захотелось и в результате появилась идея разобраться с ним лучше, сделать изолированный пример использования. Этот опыт может пригодиться в других проектах.
Прежде всего, нужно определить условия для работы:
1. Свежая JDK. Eclipse в данном случае не нужен.
2. Еще нужен небольшой набор JAR-файлов, в которых лежит Velocity.
commons-collections-3.2.jar commons-lang-2.2.jar velocity-1.6.2.jar
3. Ubuntu, т.к. я на ней проверял.
Итак, окружение готово — можно «кодить».
Импортируем (import)
Во первых, нужно импортировать несколько простых типов для работы со строками, списками, массивами, хешами и т.д.
import java.io.StringWriter; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap;
Во вторых, нужно импортировать нестандартные библиотеки, которые лежат в JAR-файлах, которые мы положили в папку lib.
import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext;
Описываем класс
public class HelloWorld {
public static void main(String[] args) throws Exception {
// Создаем движок шаблонов Velocity
VelocityEngine ve = new VelocityEngine();
// Создаем контекст из которого будут браться данные
VelocityContext context = new VelocityContext();
// Создаем "писателя"
StringWriter writer = new StringWriter();
// Описываем разные данные
ArrayList list = new ArrayList();
Map map = new HashMap();
map.put("name", "horse");
list.add( map );
map = new HashMap();
map.put("name", "dog");
list.add( map );
map = new HashMap();
map.put("name", "bear");
list.add( map );
// Упаковываем данные в контекст
context.put("testList", list);
context.put("name", "World");
// Получаем шаблон в движок шаблонов
Template t = ve.getTemplate( "helloworld.vm" );
// Смешиваем шаблон
t.merge( context, writer );
// Выдаем все это в консоль
System.out.println( writer.toString() );
}
}
Осталось самое сложное — скомпилировать и запустить приложение.
Компилируем:
javac -cp ./lib/velocity-1.6.2.jar:.:./lib/commons-collections-3.2.jar:.:./lib/commons-lang-2.2.jar HelloWorld.java
Запускаем:
java -cp ./lib/velocity-1.6.2.jar:.:./lib/commons-collections-3.2.jar:.:./lib/commons-lang-2.2.jar HelloWorld
В обоих случаях в параметре -cp мы передаем невообразимую кашу из библиотек. Что это за страшный разделитель :.: я могу только догадываться, тем более что под Windows он выглядит как-то иначе.
Шаблон helloworld.vm
После сборки приложения можно спокойно развлекаться с шаблонами.
Hello $name! Welcome to Velocity! $testList.size()
Язык шаблонов Velocity предполагает, что переменные переданные в контекст, будут вызываться как знак доллара и имя переменной ( $varName ).
Управляющие директивы предполагают наличие решетки, например #foreach обозначает начало секции с циклом.
Пример вывода списка элементов:
#foreach ( $item in $itemsList ) $item #end
Пример условия:
#if ($variable == 1) Один #elseif( $variable == 2 ) Два #else Много #end
Установка значения переменной
#set( $engineName = "Velocity" )
Более того, в Velocity можно получить доступ к полям Java-объекта, вызвать метод:
$page.title $menu.size()
Также в Velocity предусмотрен формальный способ обращения к объектам:
${item}
он может быть очень полезен в случаях, где нужно точно отделить имя переменной от тела шаблона.