Apache velocity user guide

Apache velocity user guide

Velocity — один из множества подпроектов Apache, ранее Jakarta. Это движок для обработки шаблонов (template engine), который позволяет напрямую обращаться к методам и полям Java классов.

С помощью этого движка можно генерировать HTML-страницы, SQL-запросы, XML-документы и многое другое. Хоть официально проект уже не поддерживается, Velocity очень популярен. В среде разработки Intellij IDEA есть встроенная поддержка Velocity (об этом читайте в конце статьи).

[В начале тысячелетия большой популярностью пользовался XSL (EXtensible Stylesheet Language). Это тоже обработчик шаблонов, но XSL-преобразования удобнее выполнять при работе с XML-документами, а Velocity помогает при непосредственной работе с Java-объектами.]

Чаще всего я использую Velocity framework для веб-проектов, а именно для генерации web-страниц как альтернативу JSP, JSF и прочим тяжелым технологиям. Для написания кода шаблонов используется VTL — Velocity Template Language. Перед тем как перейти к туториалу, перечислю некоторые преимущества движка Velocity:

  • язык шаблонов VTL прост в изучении (в чем вы убедитесь дальше);
  • отделяет Java-код от кода веб-страниц;
  • служит отличной альтернативой для JSP, JSF, Freemarker и т.д.;
  • может быть использован при создании библиотек тэгов для JSP;
  • потенциально позволяет веб-дизайнеру и программисту работать раздельно.

Перейдем к описанию языковых конструкций VTL (Velocity Template Language).

Все операторы языка начинаются с символа #. пспользуйте ##, в качестве однострочного, и #* с последующим *# для многострочного комментариев.

В VTL существует три вида вызовов — это переменные, свойства и методы. Все что участвует в вызове или является его результатом считается строкой (при работе с объектом, движок вызовет метод toString() этого объекта).

Переменные в VTL начинаются с символа $, например $var. В случае, если после переменной сразу идет текст, имя переменной берется в фигурные скобки — $iable. Запись $variable указывает на совсем другой объект.

Читайте также:  Bluestacks не запускаются приложения

Свойтва — это поля класса, к ним можно доступиться так — $var.Property. При выполнении этого кода, будет вызван метод getProperty() для соответсвующего Java-объекта.

Методы в теплейтах можно вызывать таким образом: $var.doSomething().

Для инициализации переменной используется конструкция set, например

В VTL есть конструкции if-else, if-elseif. Пример:

Велосити предоставляет только один вариант цикла. Он реализуется через оператор foreach. Например:

Переменная varArray может представлять собой массив, вектор или хэш-таблицу.

Оператор include позволяет вставить содержимое текстового файла в темплейт:

Элемент parse необходим для вставки другого файла-шаблона VTL. Пример использования:

При отладке кода можно использовать оператор

Этот оператор останавливает обработчик шаблонов.

Ключевое слово macro используется для написания макросов, как с параметрами, так и без таковых. Макрос после объявления может быть вызван в любом месте кода. Пример макроса, который генерирует элемент
в месте вызова:

Вызвать его можно так: #br().

В языке VTL в качестве escape-символа выступает обратный слэш "".

Не хочу вас огорчать :), но это все конструкции языка. Нюансы языка VTL можно выяснить в комментариях.

Для работы движка необходим конфигурационный файл velocity.config. Как вариант всю конфигурацию можно задать программно. Пример файла с описанием параметров находится в zip-архиве пакета.

Для обработки кода VTL нужен экземпляр класса VelocityEngine. Функция mergeTemplate(String templateName, Context context, Writer writer) принимает на вход имя шаблона и контекст и пишет результат во Writer.

Обычно я описываю небольшой Singleton класс, который загружает или описывает конфигурацию с помощью метода init(Properties props) и обрабатывает ошибки при чтении конфигурации и обработке темплейтов.

Возможно вас заинтересует практическое руководство по использованию Velocity: Velocity для создания библиотек тэгов (Taglib)

Updated: Как я уже говорил, в IDEA есть встроенная поддержка Велосити. Для того, чтобы Intellij IDEA могла проводить анализ кода прямо в vm-файлах, можно воспользоваться такой конструкцией:

Читайте также:  Elementum стримы не найдены

Теперь встретив переменную $user можно воспользоваться всеми преимуществами code-completion в среде разработки.

I’m dealing with some Java code where Velocity 1.7 is set to retrieve templates through the ClasspathResourceLoader. Below is a stripped down sample of the code. It’s from a Tapestry web application running on a Jetty server.

The Java class, the templates and the file to be included are all are in the same folder "testpackage", so in the resulting JAR they are all in the same package "testpackage".

The problem is that if the template contains an

directive, Velocity cannot find "MyInclude.vm", and it throws a ResourceNotFoundException.

Since in the argument of getTemplate I must prepend the package name to the template name, I also tried to do the same in the #include inside the template:

but the only difference is that the latter works if I run the web app from Eclipse, while the former doesn’t work not even from Eclipse. If I build, deploy the JARs and run the web app from the deployment, both syntaxes fail with the same ResourceNotFoundException.

"For security reasons, the file to be included may only be under TEMPLATE_ROOT"

This definitely could be the cause of my problem, but I haven’t been able to find any further information about what TEMPLATE_ROOT actually is.

It sounds a lot like an environment variable, but I don’t know what I should set it to, since I’m using a ClasspathResourceLoader, and the file to be included is not an actual file located in a folder, it’s inside the JAR containing the templates and the Java class (and all in the same package).

Читайте также:  Geforce gtx 1050 ti 4 гбайт

I found TEMPLATE_ROOT mentioned in another question, Where should I put Velocity template files for a command line utility built with Maven? , but it’s related to using a FileResourceLoader. I need to keep using the ClasspathResourceLoader and I need all the files to be in the JAR, not outside it as normal files in some folder.

Velocity Users Guide — The Apache Software Foundation!

  • Show more documents
  • Share
  • Embed
  • Download
  • Info
  • Flag

Velocity Users Guide The Jakarta Velocity Developers Version 1.5 Copyright © 2006 The Apache Software Foundation

Ссылка на основную публикацию
Adblock detector