rocker_用Rocker制作模板

news/2024/7/10 0:18:34 标签: java, python, vue, linux, js
rocker

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命令完成此操作:

java">mvn generate-sources

这将为target / generated-sources / rocker目录中的每个模板生成一个Java类。

现在,我们可以使用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代码如下所示:

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


http://www.niftyadmin.cn/n/1707688.html

相关文章

long long_Java中Long到Int的精确转换

long longJDK 8附带所有令人眼前一亮的东西( lambda表达式&#xff0c;流&#xff0c; Optional &#xff0c;新的Date / Time API等)来分散我的注意力&#xff0c;我并没有过多注意添加方法Math.toIntExact() 。 但是&#xff0c;这种小的添加本身可能会非常有用。 Math.toInt…

低代码学习教程:如何根据QQ号生成邮箱?

在这个内容里&#xff0c;我们来学习如何根据QQ自动生成邮箱地址&#xff0c;学会这个内容&#xff0c;希望大家能举一反三&#xff0c;去实现&#xff1a; 自动生成163邮箱。 自动生成126邮箱。 自动生成Hotmail邮箱。 …… 等等其他平台的邮箱地址&#xff0c;原理都是一样的…

HDOJ1235 ( 统计同成绩学生人数 ) 【水题】

Problem : 1235 ( 统计同成绩学生人数 ) Judge Status : AcceptedRunId : 5938229 Language : C Author : qq1203456195Code Render Status : Rendered By HDOJ C Code Render Version 0.01 Beta#include <stdio.h> #include <string.h> int main() {int…

arquillian_使用Arquillian(远程)测试OpenLiberty

arquillian听到许多好评后&#xff0c;我想我会尝试一下Open Liberty 。 在这篇文章中&#xff0c;我将讨论以下内容&#xff1a; 开放自由的设置 设置JDBC连接设置Arquillian 测试REST端点 安装开放自由 在撰写本文时&#xff0c;我正在使用Open Liberty 18.0.0.1&#xff0c…

百数案例 | 数百人参与的bpm流程审批业务落地

之前我们为大家分享过电商、人资、消防巡检等系统案例&#xff0c;今天我们将借助一个大型项目为大家展示百数bpm在二手车贷款审批业务的实际应用。项目成功实现数百人参与的bpm流程审批业务落地。对比传统模式&#xff0c;将梳理好的流程部署到线上&#xff0c;百数bpm能够帮助…

ActionScript 3 日积月累小知识点

本文是我&#xff08;aw&#xff09;在整理了相关文档和讨论之后&#xff0c;结合自己的亲自实验总结出来的一些经验和心得。我尽量描述详尽&#xff0c;避免模糊概念&#xff0c;当然也希望所有看官提出批评意见。为了表述方便&#xff0c;其中术语不限定语言&#xff0c;如我…

低代码学习教程:根据身份证号码计算性别

方法1&#xff1a;取出第17位&#xff0c;判断是否为奇数方法2&#xff1a;取出第17位&#xff0c;判断是否等于1,3,5,7,9中的任意一个数字 如何根据身份证号码自动计算性别&#xff0c;只要知道身份证第17位是性别位&#xff0c;奇数为男性&#xff0c;偶数为女性即可。 方法…

java应届期望薪资_Java 11的期望

java应届期望薪资过去的几年对Java世界一直是动荡不安的&#xff0c;在许多发行版中增加了各种各样的功能。 在开发人员社区中&#xff0c;人们逐渐意识到Java的开发速度不够快。 在最初的20年中&#xff0c;Java平台和Java开发工具包(JDK)经历了庞大&#xff0c;不规则且有些不…