VTL: Язык шаблонов Velocity

Так уж получается, что мне на работе приходится заниматься не только 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}

он может быть очень полезен в случаях, где нужно точно отделить имя переменной от тела шаблона.

Ссылки:
Руководство пользователя Velocity

Эта заметка была отправлена в категорию Все записи, Шаблонизатор и помечена тегами , , , . Постоянная ссылка на заметку.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>