В этой статье мы кратко рассмотрим Rocker , статически типизированный и быстрый шаблонизатор Java 8.
Требуемые зависимости
Чтобы начать работать с Rocker, нам нужно добавить следующие зависимости в наш проект:
01
02
03
04
05
06
07
08
09
10
11
12
|
< dependency > < groupId >com.fizzed</ groupId > < artifactId >rocker-runtime</ artifactId > < version >0.24.0</ version > </ dependency > <!-- for hot-reloading support in development --> < dependency > < groupId >com.fizzed</ groupId > < artifactId >rocker-compiler</ artifactId > < version >0.24.0</ version > </ dependency > |
Нам также нужен плагин Rocker Maven, который преобразует шаблоны Rocker в код Java:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
< build > < plugins > < plugin > < groupId >com.fizzed</ groupId > < artifactId >rocker-maven-plugin</ artifactId > < version >0.24.0</ version > < executions > < execution > < id >generate-rocker-templates</ id > < phase >generate-sources</ phase > < goals > < goal >generate</ goal > </ goals > </ execution > </ executions > </ plugin > </ plugins > </ build > |
Создание первых шаблонов
Мы начнем с простого примера, содержащего два шаблона Rocker и класс Java.
В первом шаблоне ( main.rocker.html ) мы определяем базовую структуру страницы:
01
02
03
04
05
06
07
08
09
10
|
@args (String title, RockerBody content) < html > < head > < title >@title</ title > </ head > < body > @content </ body > </ html > |
Этот шаблон имеет два параметра: заголовок страницы и элемент RockerBody с именем content. Параметр содержимого в основном является суб-шаблоном, который добавляется к тегу <body>.
Теперь мы создаем еще один шаблон ( basic.rocker.html ), который определяет содержимое, которое передается нашему первому шаблону:
1
2
3
4
5
|
@args (String name) @views.main.template("Basic example") -> { < h1 >Hello @name!</ h1 > } |
Этот шаблон имеет единственный параметр имени, который записывается в тег <h1>. Мы ссылаемся на первый шаблон ( main.rocker.html ) с помощью @ views.main и используем метод template (..) для его визуализации. «Основной пример» будет передан в качестве параметра заголовка. Параметр содержимого определен в фигурных скобках.
Рендеринг шаблонов Rocker
Шаблоны Rocker преобразуются в код Java. Это можно сделать с помощью следующей команды Maven:
1
|
mvn generate-sources |
Это создает класс Java для каждого шаблона в каталоге target / generate-sources / rocker .
Теперь мы можем визуализировать наши шаблоны, используя код Java:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public class Main { public static void main(String... args) throws Exception { // The template "basic.rocker.html" got converted to the class named "basic" // which is located in the "views" package String result = views.basic.template( "John" ) .render() .toString(); System.out.println(result); } } |
Вывод, который мы получаем, выглядит следующим образом:
1
2
3
4
5
6
7
8
|
< html > < head > < title >Basic example</ title > </ head > < body > < h1 >Hello John!</ h1 > </ body > </ html > |
Немного проблем с этим подходом заключается в том, что вам нужно запускать mvn generate-sources каждый раз, когда вы вносите изменения в файлы шаблона. Также обратите внимание, что ваш Java-код может не скомпилироваться, если генерация кода не удалась, поскольку у вас есть проблема в одном из ваших шаблонов.
Другой возможный подход — использовать горячую перезагрузку и динамически ссылаться на шаблоны через имена файлов.
В этом случае код Java выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public class Main { public static void main(String... args) throws Exception { // Enable hot reloading RockerRuntime.getInstance().setReloading( true ); // Reference via string instead of using generated code String result = Rocker.template( "views/basic.rocker.html" ) .bind( "name" , "John" ) .render() .toString(); System.out.println(result) } } |
Результат, который мы получаем, точно такой же.
Выражения
Предположим, у нас есть простой класс User, который содержит методы getFirstName () и getLastName (). В следующем примере мы видим, как мы можем работать с объектом User в шаблоне Rocker:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@import com.mscharhag.rockerexample.* @args (User user) @views.main.template("Expressions") -> { < ul > <!-- first name --> < li >@user.getFirstName()</ li > <!-- first three letters of first name --> < li >@user.getFirstName().substring(0, 3)</ li > <!-- first name and last name --> < li >@user.getFirstName() @user.getLastName()</ li > <!-- using a variable--> @name => { @user.getFirstName() @user.getLastName() } < li >@name</ li > </ ul > } |
условия
Rocker поддерживает стандартную структуру потока Java if-else, как показано в следующем примере:
01
02
03
04
05
06
07
08
09
10
11
|
@import com.mscharhag.rockerexample.* @args (User user) @views.main.template("Conditions") -> { @if (user.getFirstName().length() > 10) { < p >Long first name</ p > } else { < p >short first name</ p > } } |
Loops
Шаблоны Rocker поддерживают различные формы петель:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@import com.mscharhag.rockerexample.* @import java.util.* @args (List< User > users) @views.main.template("Loops") -> { < ul > <!-- standard for loop --> @for (int i = 0; i < users.size(); i++) { < li >@users.get(i).getFirstName()</ li > } <!-- standard 'for each' loop --> @for (User user : users) { < li >@user.getFirstName()</ li > } <!-- for each loop with additional loop information <li>0: John, first: true, last: false</li> <li>1: Martin, first: false, last: false</li> <li>2: Anna, first: false, last: true</li> --> @for ((i, user) : users) { < li >@i.index(): @user.getFirstName(), first: @i.first(), last: @i.last()</ li > } </ ul > } |
Последний цикл является специальным вариантом цикла Java для каждого. Второй индексный параметр (названный i в примере) может использоваться для доступа к текущей информации итерации.
Вывод
Rocker может быть опцией, если вы ищете шаблонизатор Java. В соответствии с тестом хранилища Rocker GitHub, Rocker намного быстрее, чем другие движки шаблонов Java, такие как Freemarker или Velocity. Подробная документация — еще один хороший момент для упоминания.
Тот факт, что Rocker компилируется в Java и позволяет передавать данные представлениям безопасным способом, довольно интересен. С одной стороны, это полезно, потому что помогает уменьшить количество ошибок. С другой стороны, эта функция немного раздражала меня, когда я писал примеры. Всякий раз, когда я вносил изменения в код, которые влияли на шаблоны Rocker (например, изменяя имя метода, вызванного в шаблоне Rocker), шаблоны перестали компилироваться. В некоторых ситуациях это снова остановило компиляцию моего Java-кода (потому что он использовал классы, сгенерированные Rocker). Это ожидается, но это может нарушить мой предпочтительный рабочий процесс — сначала писать код Java, а потом исправлять шаблоны. Ссылка на шаблоны через имена файлов вместо использования сгенерированных классов решила эту проблему (но также отбрасывает проверку типов во время компиляции).
Опубликовано на Java Code Geeks с разрешения Михаэля Шаргага, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Шаблонирование с помощью Rocker
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |