1. Обзор
Velocity — это механизм шаблонов на основе Java.
Это веб-фреймворк с открытым исходным кодом, предназначенный для использования в качестве компонента представления в архитектуре MVC, и он представляет собой альтернативу некоторым существующим технологиям, таким как JSP.
Velocity можно использовать для создания файлов XML, SQL, PostScript и большинства других текстовых форматов.
В этой статье мы рассмотрим, как его можно использовать для создания динамических веб-страниц.
2. Как работает Velocity
Основным классом Velocity является VelocityEngine.
Он управляет всем процессом чтения, анализа и создания контента с использованием модели данных и шаблона скорости.
Проще говоря, вот шаги, которые нам необходимо выполнить для любого типичного приложения скорости:
Инициализировать движок скорости Прочитать шаблон Поместить модель данных в объект контекста Объединить шаблон с данными контекста и визуализировать представление
-
Давайте рассмотрим пример, выполнив следующие простые шаги:
3. Зависимости Maven
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init();
Template t = velocityEngine.getTemplate("index.vm");
VelocityContext context = new VelocityContext();
context.put("name", "World");
StringWriter writer = new StringWriter();
t.merge( context, writer );
Для работы с Velocity нам нужно добавить следующие зависимости в наш проект Maven:
Последняя версия обоих эти зависимости могут быть здесь: Velocity и Velocity-tools.
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
4. Язык шаблонов Velocity
Язык шаблонов Velocity (VTL) обеспечивает самый простой и чистый способ добавления динамического содержимого на веб-страницу с использованием ссылок VTL.
Ссылка VTL в шаблоне скорости начинается с символа $ и используется для получения значения, связанного с этой ссылкой. VTL также предоставляет набор директив, которые можно использовать для управления выводом кода Java. Эти директивы начинаются с #.
4.1. Ссылки
В Velocity есть три типа ссылок, переменных, свойств и методов:
переменные — определяются на странице с помощью директивы #set или значения, возвращаемого из поля объекта Java: #set ($message=\»Hello World\») свойства — относятся к полям внутри объекта; они также могут ссылаться на метод получения свойства: методы $customer.name — ссылаться на метод объекта Java: $customer.getName()
-
Окончательное значение, полученное из каждой ссылки, преобразуется в строку, когда он преобразуется в окончательный вывод.
4.2. Директивы
VTL предоставляет богатый набор директив:
«set — может использоваться для установки значения ссылки; это значение может быть присвоено переменной или ссылке на свойство: #set ($message = \»Hello World\»)\n#set ($customer.name = \»Brian Mcdonald\») условные операторы — директивы #if, #elseif и #else позволяют генерировать контент на основе условных проверок: #if($employee.designation == \»Manager\» )\n \u003ch3\u003e Менеджер \u003c/h3\u003e\n#elseif($employee.designation == \»Старший разработчик\»)\n \u003ch3\u003e Старший инженер-программист \u003c/h3\u003e\n#еще\n \u003ch3\u003e Стажер \u003c/h3\u003e\n#end loops — директива #foreach позволяет зацикливаться на наборе объектов: \u003cul\u003e\n #foreach($product в $productList)\n \u003cli\u003e $продукт \u003c/li\u003e\n #конец\n\u003c/ul\u003e include — элемент #include позволяет импортировать файлы в шаблон: #include(\»one.gif\»,\»two.txt\»,\»three.html\»…) parse — # оператор parse позволяет разработчику шаблона импортировать другой локальный файл, содержащий VTL; Затем Velocity проанализирует содержимое и отобразит его: #parse (Template) Assessment — директива #evaluate может использоваться для динамической оценки VTL; это позволяет шаблону оценивать строку во время рендеринга, например, интернационализировать шаблон: #set($firstName = \»David\»)\n#set($lastName = \»Джонсон\»)\n\n#set($dynamicsource = \»$firstName$lastName\»)\n\n#evaluate($dynamicsource) break — директива #break останавливает любой дальнейший рендеринг текущей области выполнения (т. е. #foreach, #parse) stop — директива #stop останавливает любой дальнейший рендеринг и выполнение шаблона. velocimacros — директива #macro позволяет разработчику шаблона определить повторяющийся сегмент VTL: #macro(tablerows)\n \u003ctr\u003e\n \u003cтд\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n#end Этот макрос теперь можно разместить в любом месте шаблона как #tablerows(): #macro(tablerows $color $productList)\n #foreach($product в $productList)\n \u003ctr\u003e\n \u003ctd bgcolor=$color\u003e$product.name\u003c/td\u003e\n \u003c/tr\u003e\n #конец\n#конец
-
4.3. Другие возможности
math — несколько встроенных математических функций, которые можно использовать в шаблонах: #set($percent = $number / 100)\n#set($remainder = $dividend % $divisor) оператор диапазона, который можно использовать вместе с #set и #foreach: #set($array = [0..10])\n\n#foreach($elem в $arr)\n $elem\n#end
-
5. Velocity Servlet
Основной задачей Velocity Engine является создание содержимого на основе шаблона.
Движок сам по себе не содержит каких-либо веб-функций. Чтобы реализовать веб-приложение, нам нужно использовать сервлет или платформу на основе сервлетов.
Velocity предоставляет готовую реализацию VelocityViewServlet, которая является частью подпроекта speed-tools.
Чтобы использовать встроенную функциональность, предоставляемую VelocityViewServlet, мы можем расширить наш сервлет из VelocityViewServlet и переопределить метод handleRequest():
6. Конфигурация
public class ProductServlet extends VelocityViewServlet {
ProductService service = new ProductService();
@Override
public Template handleRequest(
HttpServletRequest request,
HttpServletResponse response,
Context context) throws Exception {
List<Product> products = service.getProducts();
context.put("products", products);
return getTemplate("index.vm");
}
}
6.1. Веб-конфигурация
Давайте теперь посмотрим, как настроить VelocityViewServlet в файле web.xml.
Нам нужно указать необязательные параметры инициализации, которые включают в себя speed.properties и toolbox.xml:
Нам также нужно указать отображение для этого сервлета. Все запросы на шаблоны скорости (*.vm) должны обслуживаться сервлетом скорости:
<web-app>
<display-name>apache-velocity</display-name>
//...
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
//...
</web-app>
6.2. Загрузчик ресурсов
<servlet-mapping>
<servlet-name>velocityLayout</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
Velocity предоставляет гибкую систему загрузки ресурсов. Он позволяет одновременно работать одному или нескольким загрузчикам ресурсов:
FileResourceLoader JarResourceLoader ClassPathResourceLoader URLResourceLoader DataSourceResourceLoader WebappResourceLoader
-
Эти загрузчики ресурсов настраиваются в файле Velocity.properties:
7. Шаблон Velocity ~~ ~ Шаблон Velocity — это место, где прописана вся логика генерации представления. Эти страницы написаны с использованием языка шаблонов Velocity (VTL):
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader
webapp.resource.loader.path =
webapp.resource.loader.cache = true
8. Управление макетом страницы
Velocity обеспечивает простое управление макетом и настраиваемые экраны ошибок для приложения на основе Velocity Tool.
<html>
...
<body>
<center>
...
<h2>$products.size() Products on Sale!</h2>
<br/>
We are proud to offer these fine products
at these amazing prices.
...
#set( $count = 1 )
<table class="gridtable">
<tr>
<th>Serial #</th>
<th>Product Name</th>
<th>Price</th>
</tr>
#foreach( $product in $products )
<tr>
<td>$count)</td>
<td>$product.getName()</td>
<td>$product.getPrice()</td>
</tr>
#set( $count = $count + 1 )
#end
</table>
<br/>
</center>
</body>
</html>
VelocityLayoutServlet инкапсулирует эту возможность для отображения указанных макетов. VelocityLayoutServlet является расширением VelocityViewServlet.
«8.1. Веб-конфигурация
Давайте посмотрим, как настроить VelocityLayoutServlet. Сервлет предназначен для перехвата запросов к страницам шаблона скорости, а специфические свойства макета определены в файле Velocity.properties:
8.2. Шаблоны макетов
Шаблон макета определяет типичную структуру страницы скорости. По умолчанию VelocityLayoutServlet ищет Default.vm в папке макета. Переопределение нескольких свойств может изменить это расположение:
<web-app>
// ...
<servlet>
<servlet-name>velocityLayout</servlet-name>
<servlet-class>org.apache.velocity.tools.view.VelocityLayoutServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
// ...
<servlet-mapping>
<servlet-name>velocityLayout</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
// ...
</web-app>
Файл макета состоит из шаблона заголовка, шаблона нижнего колонтитула и переменной скорости $screen_content, которая отображает содержимое запрошенной страницы скорости:
8.3. Спецификация макета на запрошенном экране
tools.view.servlet.layout.directory = layout/
tools.view.servlet.layout.default.template = Default.vm
Макет для конкретного экрана может быть определен как переменная скорости в начале страницы. Это делается путем размещения этой строки на странице:
<html>
<head>
<title>Velocity</title>
</head>
<body>
<div>
#parse("/fragments/header.vm")
</div>
<div>
<!-- View index.vm is inserted here -->
$screen_content
</div>
<div>
#parse("/fragments/footer.vm")
</div>
</body>
</html>
8.4. Спецификация макета в параметре запроса
Мы можем добавить параметр запроса в строку запроса layout=MyOtherLayout.vm, и VLS найдет его и отобразит экран в этом макете вместо поиска макета по умолчанию.
#set($layout = "MyOtherLayout.vm")
8.5. Экраны ошибок
Пользовательский экран ошибок может быть реализован с использованием макета скорости. VelocityLayoutServlet предоставляет две переменные $error_cause и $stack_trace для представления сведений об исключении.
Страница ошибки может быть настроена в файле velocity.properties:
9. Заключение
В этой статье мы узнали, как Velocity является полезным инструментом для рендеринга динамических веб-страниц. Кроме того, мы видели различные способы использования сервлетов, предоставляемых скоростью.
tools.view.servlet.error.template = Error.vm
У нас также есть статья, посвященная конфигурации Velocity с Spring MVC здесь, в Baeldung.
Полный код этого руководства доступен на GitHub.
«
The complete code for this tutorial is available over on GitHub.