rocker
在本文中,我们将快速介绍Rocker ,这是一个静态类型化的快速Java 8模板引擎。
必需的依赖项
要开始使用Rocker,我们需要在项目中添加以下依赖项:
<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代码:
<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 )中,我们定义了基本的页面结构:
@args (String title, RockerBody content)
<html>
<head>
<title>@title</title>
</head>
<body>
@content
</body>
</html>
该模板具有两个参数:页面标题和名为content的RockerBody元素。 content参数基本上是添加到<body>标记的子模板。
现在,我们创建另一个模板( basic.rocker.html ),该模板定义传递给我们的第一个模板的内容:
@args (String name)
@views.main.template("Basic example") -> {
<h1>Hello @name!</h1>
}
该模板具有写入到<h1>标记的单个名称参数。 我们使用@ views.main引用第一个模板( main.rocker.html ),并使用template(..)方法进行渲染。 “基本示例”将作为标题参数传递。 content参数在花括号内定义。
渲染跷板模板
将Rocker模板转换为Java代码。 可以使用以下Maven命令完成此操作:
mvn generate-sources
这将为target / generated-sources / rocker目录中的每个模板生成一个Java类。
现在,我们可以使用Java代码呈现模板:
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);
}
}
我们得到的输出如下所示:
<html>
<head>
<title>Basic example</title>
</head>
<body>
<h1>Hello John!</h1>
</body>
</html>
这种方法的一个问题是,每次在模板文件中进行更改时,都需要运行mvn generate-sources。 另请注意,如果代码生成失败,则Java代码可能无法编译,因为其中一个模板存在问题。
另一种可能的方法是使用热重载并通过文件名动态引用模板。
在这种情况下,Java代码如下所示:
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()。 在以下示例中,我们看到了如何在Rocker模板中使用User对象:
@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流结构,如以下示例所示:
@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>
}
}
循环
跷板模板支持不同形式的循环:
@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 for-each循环的特殊变体。 第二个索引参数(在示例中为i)可用于访问当前迭代信息。
结论
如果您正在寻找Java模板引擎,那么Rocker无疑是一个选择。 根据Rocker GitHub存储库上的基准, Rocker比其他Java模板引擎(如Freemarker或Velocity)快得多。 全面的文档是另一个值得一提的地方。
Rocker可以编译为Java,并允许您以类型安全的方式将数据传递到视图这一事实非常有趣。 一方面,这很有用,因为它有助于减少错误。 另一方面,当我编写示例时,相同的功能使我有些恼火。 每当我更改影响Rocker模板的代码时(例如,通过更改Rocker模板中调用的方法的名称),模板就会停止编译。 在某些情况下,这再次使我的Java代码无法编译(因为它使用的是Rocker生成的类)。 这是预料之中的,但这可能会破坏我首选的工作流程,即先编写Java代码然后再修复模板。 通过文件名而不是使用生成的类来引用模板可以解决此问题(但也可以避免在编译时进行类型检查)。
翻译自: https://www.javacodegeeks.com/2018/05/templating-with-rocker.html
rocker