Перейти к основному содержимому

Введение в скорость Apache

· 7 мин. чтения

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 .