1. Обзор
Velocity — это шаблонизатор на основе Java.
Это веб-фреймворк с открытым исходным кодом, предназначенный для использования в качестве компонента представления в архитектуре MVC, и он представляет собой альтернативу некоторым существующим технологиям, таким как JSP.
Velocity можно использовать для создания файлов XML, SQL, PostScript и большинства других текстовых форматов.
В этой статье мы рассмотрим, как его можно использовать для создания динамических веб-страниц.
2. Как работает скорость
Основным классом Velocity является VelocityEngine
.
Он организует весь процесс чтения, анализа и создания контента с использованием модели данных и шаблона скорости.
Проще говоря, вот шаги, которые нам нужно выполнить для любого типичного приложения скорости:
- Инициализировать двигатель скорости
- Читать шаблон
- Поместите модель данных в объект контекста
- Объедините шаблон с данными контекста и визуализируйте представление
Давайте рассмотрим пример, выполнив следующие простые шаги:
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 );
3. Зависимости Maven
Для работы с Velocity нам нужно добавить следующие зависимости в наш проект Maven:
<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>
Последние версии обеих этих зависимостей могут быть здесь: Velocity и Velocity-tools .
4. Язык шаблонов скорости
Язык шаблонов 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")
#set ($customer.name = "Brian Mcdonald")
- условные обозначения —
директивы #if, #elseif
и#else
позволяют генерировать контент на основе условных проверок:
#if($employee.designation == "Manager")
<h3> Manager </h3>
#elseif($employee.designation == "Senior Developer")
<h3> Senior Software Engineer </h3>
#else
<h3> Trainee </h3>
#end
- loops — директива
#foreach
позволяет зацикливаться на наборе объектов:
<ul>
#foreach($product in $productList)
<li> $product </li>
#end
</ul>
- include — элемент
#include
предоставляет возможность импортировать файлы в шаблон:
#include("one.gif","two.txt","three.html"...)
- parse — оператор
#parse
позволяет разработчику шаблона импортировать другой локальный файл, содержащий VTL; Затем Velocity проанализирует содержимое и отобразит его:
#parse (Template)
- оценить — директиву
#evaluate
можно использовать для динамической оценки VTL; это позволяет шаблону оцениватьстроку
во время рендеринга, например, интернационализировать шаблон:
#set($firstName = "David")
#set($lastName = "Johnson")
#set($dynamicsource = "$firstName$lastName")
#evaluate($dynamicsource)
- break — директива
#break
останавливает любой дальнейший рендеринг текущей области выполнения (т.е.#foreach
,#parse
) - stop — директива
#stop
останавливает дальнейший рендеринг и выполнение шаблона. - velocimacros — директива
#macro
позволяет разработчику шаблона определить повторяющийся сегмент VTL:
#macro(tablerows)
<tr>
<td>
</td>
</tr>
#end
Этот макрос теперь можно разместить в любом месте шаблона как # tablerows():
#macro(tablerows $color $productList)
#foreach($product in $productList)
<tr>
<td bgcolor=$color>$product.name</td>
</tr>
#end
#end
4.3. Другие особенности
- math — несколько встроенных математических функций, которые можно использовать в шаблонах:
#set($percent = $number / 100)
#set($remainder = $dividend % $divisor)
- оператор диапазона , который можно использовать в сочетании с
#set
и#foreach:
#set($array = [0..10])
#foreach($elem in $arr)
$elem
#end
5. Скоростной сервлет
Основная задача Velocity Engine — генерировать контент на основе шаблона.
Сам по себе движок не содержит каких-либо веб-функций. Чтобы реализовать веб-приложение, нам нужно использовать сервлет или платформу на основе сервлетов.
Velocity предоставляет готовую реализацию VelocityViewServlet
, которая является частью подпроекта Velocity-Tools.
Чтобы использовать встроенную функциональность, предоставляемую VelocityViewServlet,
мы можем расширить наш сервлет из VelocityViewServlet
и переопределить метод handleRequest()
:
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. Конфигурация
6.1. Веб-конфигурация
Давайте теперь посмотрим, как настроить VelocityViewServlet
в файле web.xml
.
Нам нужно указать необязательные параметры инициализации, которые включают в себя Velocity.properties
и toolbox.xml
: ``
<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>
Нам также нужно указать сопоставление для этого сервлета. Все запросы на шаблоны скорости ( *.vm
) должны обслуживаться сервлетом скорости:
<servlet-mapping>
<servlet-name>velocityLayout</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
6.2. Загрузчик ресурсов
Velocity предоставляет гибкую систему загрузки ресурсов. Это позволяет одновременно работать одному или нескольким загрузчикам ресурсов:
FileResourceLoader
JarResourceLoader
ClassPathResourceLoader
URLResourceLoader
DataSourceResourceLoader
WebappResourceLoader
Эти загрузчики ресурсов настраиваются в файле Velocity.properties:
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader
webapp.resource.loader.path =
webapp.resource.loader.cache = true
7. Шаблон скорости
Шаблон Velocity — это место, где прописана вся логика генерации представления. Эти страницы написаны с использованием языка шаблонов Velocity (VTL):
<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>
8. Управление макетом страницы
Velocity обеспечивает простое управление компоновкой и настраиваемые экраны ошибок для приложения на основе Velocity Tool.
VelocityLayoutServlet
инкапсулирует эту возможность для отображения указанных макетов. VelocityLayoutServlet
является расширением VelocityViewServlet.
8.1. Веб-конфигурация
Давайте посмотрим, как настроить VelocityLayoutServlet.
Сервлет предназначен для перехвата запросов к страницам шаблона скорости, а специфические свойства макета определены в файле
Velocity.properties:
<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>
8.2. Шаблоны макетов
Шаблон макета определяет типичную структуру страницы скорости. По умолчанию VelocityLayoutServlet
ищет Default.vm
в папке макета. Переопределение нескольких свойств может изменить это местоположение:
tools.view.servlet.layout.directory = layout/
tools.view.servlet.layout.default.template = Default.vm
Файл макета состоит из шаблона заголовка, шаблона нижнего колонтитула и переменной скорости $screen_content
, которая отображает содержимое запрошенной страницы скорости:
<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.3. Спецификация макета на запрошенном экране
Макет для конкретного экрана может быть определен как переменная скорости в начале страницы. Это делается путем размещения этой строки на странице:
#set($layout = "MyOtherLayout.vm")
8.4. Спецификация макета в параметре запроса
Мы можем добавить параметр запроса в строку запроса layout=MyOtherLayout.vm,
и VLS найдет его и отобразит экран в этом макете вместо поиска макета по умолчанию.
8.5. Экраны ошибок
Пользовательский экран ошибок может быть реализован с использованием макета скорости. VelocityLayoutServlet
предоставляет две переменные $error_cause
и $stack_trace
для представления сведений об исключении.
Страница ошибки может быть настроена в файле Velocity.properties
:
tools.view.servlet.error.template = Error.vm
9. Заключение
В этой статье мы узнали, как Velocity является полезным инструментом для рендеринга динамических веб-страниц. Кроме того, мы видели различные способы использования сервлетов, предоставляемых скоростью.
У нас также есть статья, посвященная конфигурации Velocity с Spring MVC здесь, в ForEach .
Полный код этого руководства доступен на GitHub .