Введение в Apache Velocity

Введение в Apache Velocity

1. обзор

Velocity - это шаблонизатор на основе Java.

Это веб-фреймворк с открытым исходным кодом, предназначенный для использования в качестве компонента представления в архитектуре MVC, и он обеспечивает альтернативу некоторым существующим технологиям, таким как JSP.

Скорость может быть использована для генерации файлов XML, SQL, PostScript и большинства других текстовых форматов.

В этой статье мы рассмотрим, как его можно использовать для создания динамических веб-страниц.

2. Как работает скорость

Основной класс Velocity -VelocityEngine.

Он организует весь процесс чтения, анализа и генерации контента с использованием модели данных и шаблона скорости.

Проще говоря, вот шаги, которые мы должны выполнить для любого типичного применения скорости:

  • Инициализировать двигатель скорости

  • Прочитайте шаблон

  • Поместите модель данных в объект контекста

  • Объединить шаблон с данными контекста и визуализировать представление

Let’s go through an example, выполнив следующие простые шаги:

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:


    org.apache.velocity
    velocity
    1.7
    

     org.apache.velocity
     velocity-tools
     2.0

Последняя версия обеих этих зависимостей может быть здесь:velocity иvelocity-tools.

4. Язык шаблона скорости

Velocity Template Language (VTL) обеспечивает самый простой и чистый способ включения динамического содержимого в веб-страницу с использованием ссылок VTL.

Задание VTL в шаблоне скорости начинается с$ и используется для получения значения, связанного с этим заданием. VTL также предоставляет набор директив, которые можно использовать для управления выводом кода Java. Эти директивы начинаются с#.

4.1. Рекомендации

В Velocity есть три типа ссылок: переменные, свойства и методы:

  • variables - определяется на странице с помощью директивы#set или значения, возвращаемого из поля объекта Java:

    #set ($message="Hello World")
  • properties - ссылка на поля внутри объекта; они также могут ссылаться на метод свойстваgetter:

    $customer.name
  • methods - обратитесь к методу объекта Java:

    $customer.getName()

Конечное значение, полученное из каждой ссылки, преобразуется в строку, когда оно отображается в окончательном выводе.

4.2. Директивы

VTL предоставляет богатый набор директив:

  • set - может использоваться для установки значения ссылки; это значение может быть присвоено переменной или ссылке на свойство:

    #set ($message = "Hello World")
    #set ($customer.name = "Brian Mcdonald")
  • conditionals - директивы#if, #elseif и#else предоставляют способ генерации содержимого на основе условных проверок:

    #if($employee.designation == "Manager")
        

    Manager

    #elseif($employee.designation == "Senior Developer")

    Senior Software Engineer

    #else

    Trainee

    #end
  • Директиваloops -#foreach позволяет перебирать коллекцию объектов:

      #foreach($product in $productList)
    • $product
    • #end
  • include - элемент#include предоставляет возможность импортировать файлы в шаблон:

    #include("one.gif","two.txt","three.html"...)
  • parse - оператор#parse позволяет разработчику шаблона импортировать другой локальный файл, содержащий VTL; Затем Velocity проанализирует контент и отобразит его:

    #parse (Template)
  • evaluate - директива#evaluate может использоваться для динамической оценки VTL; это позволяет шаблону оцениватьString во время рендеринга, например, для интернационализации шаблона:

    #set($firstName = "David")
    #set($lastName = "Johnson")
    
    #set($dynamicsource = "$firstName$lastName")
    
    #evaluate($dynamicsource)
  • break - директива#break останавливает дальнейший рендеринг текущей области выполнения (т.е. #foreach,#parse)

  • stop - директива#stop останавливает любую дальнейшую визуализацию и выполнение шаблона.

  • velocimacros - директива#macro позволяет разработчику шаблона определять повторяющийся сегмент VTL:

    #macro(tablerows)
        
            
            
        
    #end

    Этот макрос теперь можно разместить в любом месте шаблона как #tablerows():

    #macro(tablerows $color $productList)
        #foreach($product in $productList)
            
                $product.name
            
        #end
    #end

4.3. Другие преимущества

  • math - несколько встроенных математических функций, которые можно использовать в шаблонах:

    #set($percent = $number / 100)
    #set($remainder = $dividend % $divisor)
  • range operator - может использоваться вместе с#set и#foreach:

    #set($array = [0..10])
    
    #foreach($elem in $arr)
        $elem
    #end

5. Сервлет скорости

Основная задача Velocity Engine - генерировать контент на основе шаблона.

Сам по себе движок не содержит каких-либо веб-функций. Для реализации веб-приложения нам нужно использовать фреймворк на основе сервлета или сервлета.

Velocity предоставляет одну из готовых реализацийVelocityViewServlet, которая является частью подпроекта инструментов скорости.

Чтобы использовать встроенные функции, предоставляемые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 products = service.getProducts();
        context.put("products", products);

        return getTemplate("index.vm");
    }
}

6. конфигурация

6.1. Веб-конфигурация

Давайте теперь посмотрим, как настроитьVelocityViewServlet вweb.xml.

Нам нужно указать дополнительные параметры инициализации, которые включаютvelocity.properties иtoolbox.xml:


    apache-velocity
      //...

    
        velocity
        org.apache.velocity.tools.view.VelocityViewServlet

        
            org.apache.velocity.properties
            /WEB-INF/velocity.properties
        
    
        //...

Нам также нужно указать отображение для этого сервлета. Все запросы шаблонов скорости (*.vm) должны обслуживаться сервлетом скорости:


    velocityLayout
    *.vm

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 Template Language (VTL):


    ...
    
        
...

$products.size() Products on Sale!


We are proud to offer these fine products at these amazing prices. ... #set( $count = 1 ) #foreach( $product in $products ) #set( $count = $count + 1 ) #end
Serial # Product Name Price
$count) $product.getName() $product.getPrice()

8. Управление макетом страницы

Velocity предоставляет простое управление макетом и настраиваемые экраны ошибок для приложения на основе Velocity Tool.

VelocityLayoutServlet инкапсулирует эту возможность для рендеринга указанных макетов. VelocityLayoutServlet является расширением доVelocityViewServlet.

8.1. Веб-конфигурация

Давайте посмотрим, как настроитьVelocityLayoutServlet.. Сервлет определен для перехвата запросов к страницам шаблона скорости, а специфические свойства макета определены в файлеvelocity.properties:


    // ...
    
        velocityLayout
        org.apache.velocity.tools.view.VelocityLayoutServlet

        
            org.apache.velocity.properties
            /WEB-INF/velocity.properties
        
    
    // ...
    
        velocityLayout
        *.vm
    
    // ...

8.2. Шаблоны макетов

Шаблон макета определяет типичную структуру страницы скорости. По умолчаниюVelocityLayoutServlet ищетDefault.vm в папке макета. Переопределение нескольких свойств может изменить это местоположение:

tools.view.servlet.layout.directory = layout/
tools.view.servlet.layout.default.template = Default.vm

Файл макета состоит из шаблона заголовка, шаблона нижнего колонтитула и переменной скорости$screen_content, которая отображает содержимое запрашиваемой страницы скорости:


    
        Velocity
    
    
        
#parse("/fragments/header.vm")
$screen_content
#parse("/fragments/footer.vm")

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 MVChere at example.

Полный код этого руководства доступенover on GitHub.