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.