用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" packageString 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 reloadingRockerRuntime.getInstance().setReloading(true);// Reference via string instead of using generated codeString 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10高分辨率下修改字体显示大小(不是缩放百分比)

问题 不通过修改设置缩放百分比来增大win10的字体显示大小&#xff0c;缩放百分比调大后会导致很多问题出现&#xff01;&#xff01;&#xff01; 修改 打开设置&#xff0c;或者右键个性化&#xff0c;在搜索栏输入&#xff1a;“放大文本大小”&#xff0c;搜索框下面会自…

【MFC系列-第33天】链接控件自绘技术

33.1 常用的字体复制 方法一 CFont* pFont pDC->GetCurrentFont(); LOGFONT lf; pFont->GetLogFont(&lf); m_fontN.CreateFontIndirect(&lf); lf.lfUnderline TRUE; m_fontT.CreateFontIndirect(&lf);方法二 HFONT hFont (HFONT)GetStockObject(DEFAUL…

guava读取配置文件_使用Guava MapSplitters配置Hadoop

guava读取配置文件在本文中&#xff0c;我们将为通过Context对象将配置参数传递给Hadoop Mapper提供新的思路。 通常&#xff0c;我们在启动map-reduce作业时将配置参数设置为Context对象上的键/值对。 然后在Mapper中&#xff0c;我们使用键来检索要用于我们的配置需求的值。 …

应用程序无法正常启动 0xc0150002

Visual Studio 2017在debug下运行程序报错 应用程序无法正常启动 0xc0150002 分析原因 可能是&#xff1a;原程序是低版本的VS所编写的&#xff0c;缺少低版本的运行库&#xff0c;所以报错 解决 安装了VS2010后即可正常运行 error LNK2019: 无法解析的外部符号 __vsnwprin…

Zuul 2 –样本过滤器

Zuul 2终于开源了 。 我第一次听到Zuul 2年Spring由米奇科恩一个2016的讲就是可以在这里找到 &#xff0c;这是好事&#xff0c;终于可以用它玩。 为了快速实现Zuul 2之类的网关的目的–网关提供了微服务生态系统的切入点。 由于所有客户的请求都是通过网关路由的&#xff0c;…

Excel之抽奖器实现

Excel实现一个抽奖器&#xff0c;关键在于学会几个Excel中的函数即可轻松实现。 单人抽奖 RANDBETWEEN 例&#xff1a; INDEX(A2:A61,RANDBETWEEN(1,60))缺点&#xff1a;这种方式生成的抽奖器&#xff0c;在多人情况下&#xff0c;由于RANDBETWEEN函数的返回值有可能是相同…

【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)

关注公号【逆向通信猿】更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 【多元域乘法】多项式乘法电路原理及MATLAB详解 【多元域除法】多项式除法电路原理及MATLAB详解 RS码编码原理 RS码的编码与BCH码类似,区别在于RS码为多进制的 生成多项式…

【RS码2】RS码的BM迭代译码原理详解及MATLAB实现(不使用MATLAB库函数【全部代码需私信另外付费获取】)

理论基础 订阅《信道编码》专栏,首先查阅各子程序的详解 【有限域生成】本原多项式生成有限域的原理及MATLAB实现 【有限域除法】二元多项式除法电路原理及MATLAB详解 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 【多元域乘法】多项式乘法电路原理…

QT开发基础

QT中可以使用qmake来生成Makefile&#xff0c;由.pro文件生成Makefile的命令如下&#xff1a; qmake hello.pro -o Makefile make模板(TEMPLATE) 模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择&#xff1a; app - 建立一个应用程序的makefile。这…

Shebang来Java了吗?

尽管添加对Unix风格的shebang &#xff08; #! &#xff09;的支持从来不是 JEP 330 [“启动单文件源代码程序”] 的中心目标 &#xff0c;但围绕JEP 330“单个文件源程序”的潜在功能存在一些问题。为了支持Unix风格的shebang &#xff0c;在OpenJDK jdk-dev邮件列表上引起了广…

【C++编程题1】数组指针之字符串排序

题目 用数组指针处理50个不等长字符串。写一个函数对字符串按降序排序&#xff0c;然后在主函数输入这50个字符串&#xff0c;调用函数后&#xff0c;再输出这50个已经排好序的字符串。 代码 子函数&#xff1a; #include <iostream> using namespace std; #define N…

如何用Java编写类似C的Sizeof函数

如果您刚开始学习Java并且是C语言背景&#xff0c;那么您可能已经注意到Java和C编程语言之间存在一些差异&#xff0c;例如String是Java中的对象&#xff0c;而不是NULL终止的字符数组。 同样&#xff0c;Java中没有sizeof&#xff08;&#xff09;运算符。 所有原始值都有预定…

【C++编程题2】字符串插入空格

题目 从键盘输入一个字符串&#xff0c;然后按照下面要求输出 从键盘输入一个字符串&#xff0c;然后按照下面要求输出一个新字符串&#xff1a;新串是在原串中的每两个字符之间插入一个空格&#xff0c;如原串为 abcd&#xff0c;则新串为a口b口c口d口&#xff08;口表示空格…

Spring启动教程

1.简介 如果您一直想使用一个Web框架&#xff0c;它使您能够快速开始API开发&#xff0c;而无须设置Web服务器&#xff0c;收集所有有线依赖项&#xff0c;安装各种工具的麻烦&#xff0c;那么您将拥有一个出色的框架&#xff0c;即Spring开机 Spring Boot的主要座右铭是约定优…

【LDPC系列1】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真

关注公号【逆向通信猿】更精彩!!! 1. 构造编码器对象 采用MATLAB内置的comm.LDPCEncoder构造编码器对象,其中使用默认的校验矩阵,信息位长32400比特,码长64800比特,该校验矩阵中除第一行中1的个数为6个外,其余行中1的个数均为7;前12960列中1的个数为8,后32400列构成…

【LDPC系列2】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真(IEEE 802.16e标准协议基础矩阵)

关注公号【逆向通信猿】更精彩!!! 1. 构造校验矩阵H,并保存为mat文件 采用IEEE 802.16e标准协议中的基础校验矩阵 通过构造QC-LDPC校验矩阵,码长n=2304,信息长k=1152,码率r=1/2,基础矩阵维数为1224: Hb = [-1 94 73 -1

.xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询

.xhr长轮询在我们的最后一集中 &#xff0c; Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问&#xff0c;方法是为他提供最初为女友购买的保时捷。 这位首席执行官的女友因失去保时捷而感到不安&#xff0c;已将其婚外恋告诉了他的妻子。 他的妻子在分拆了CEO的套…

十进制数与八进制数互相转换(MATLAB和C版本)

一、八进制数转十进制数 C语言实现 实现思路和参数: /* Function: ConvertOctaltoDecimal* Abstract: Convert an octal number to its equivalent decimal value** - First compute the number of digits in the octal number* - Then perform the conversion, one …

Java正成为COBOL的一部分-它将成为COBOL的一部分吗?

任何从大学&#xff0c;技术学校或社区学院毕业的计算机科学专业都接受过培训。 每个身材高大的公司都使用该语言&#xff0c;并拥有一批具备此能力的程序员。 通用语言可以推动业务发展。 1985年是COBOL。今天是Java。 尽管存在差异&#xff0c;但这两种语言在行为轨迹上都具…

VS2010附加进程调试DLL时断点无法断下的解决方法

系统版本&#xff1a;Win10 x64 1809 VS版本&#xff1a;VS2017 企业版 问题一 在动态链接库(DLL)附加到进程调试时&#xff0c;用VS2017附加后单步调试&#xff0c;结果发现总是在调试过程中卡死&#xff0c;VS2017无响应&#xff1b; 解决办法是&#xff1a;强制结束VS2017…