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

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

容器rocker

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

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

相关文章

android 开源 示波器,上个老外的开源虚拟示波器

这个老贵~&#xff01;Price USD (US Dollar) $ 1595.00Network BitScope 442 ( BS442N )(原文件名:bs445n.png)(原文件名:bs440e.jpg)BS442NBS325NBS325UBS100UBS50UThe correct appearance of this website is only visible in graphical browsers that support web standard…

Java子类的成员方法可以直接调用父类的成员方法和成员变量

public class Teacher extends Employee {public static void main(String[] args) {}public void method() {super.method(); // 可以直接调父类的成员方法super.name; // 访问父类的成员变量System.out.println("子类方法执行&#xff01;");} }我的理解&#xff1…

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

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

html文件压缩成gzip,前端性能优化成神之路-HTTP压缩开启gzip

什么是HTTP压缩cssHTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法&#xff0c;好比gzip来压缩HTML,Javascript, CSS文件。 能大大减小网络传输的数据量&#xff0c;提升了用户显示网页的速度。固然&#xff0c;同时会增长一点点服…

Java中父类的静态变量和静态方法的继承问题

1.普通父类的静态变量和方法&#xff0c;可以通过子类的名称访问和调用 2.普通父类的静态变量和方法&#xff0c;可以通过子类的实例对象访问和调用 3.抽象父类的静态变量和方法&#xff0c;可以通过具体子类的名称访问和调用 4.抽象父类的静态变量和方法&#xff0c;可以通过具…

jdk10与jdk9的区别_JDK 8与JDK 10:三元/拆箱的区别

jdk10与jdk9的区别最近的Nicolai Parlog &#xff08; nipafx &#xff09; 鸣叫引起了我的注意&#xff0c;因为它引用了一个有趣的StackOverflow讨论 &#xff0c;该讨论涉及JDK 8和JDK 10之间的行为更改&#xff0c;并询问“为什么&#xff1f;” SerCe 在StackOverflow线程…

Java的多态形式中,如何访问成员变量和调用成员方法

文章目录简介演示案例简介 多态&#xff0c;多态使 Java 更有生命和鲜活起来。多态指子类对象可以直接赋值给父类变量&#xff0c;但在运行时依然表现出子类的特征。Java 引用变量有两种类型&#xff0c;分别是编译时类型和运行时类型&#xff0c;编译时类型由声明类型决定&am…

cobol和java_Java正成为COBOL的一部分-它将成为COBOL的一部分吗?

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

android 6.0 dm-verity技术,Android 7.0安全性大幅提升,要求严格强制执行验证启动

在我们针对 Android 7.0 对 dm-verity 所做的更改中&#xff0c;我们使用了一个称为交错的技术&#xff0c;利用该技术&#xff0c;我们不仅可以从丢失的整个 4 KiB 源块恢复数据&#xff0c;还可从多个连续块恢复数据&#xff0c;与此同时&#xff0c;与朴素实现相比&#xff…

Java的final关键字

1.abstract 和 final 不能同时存在&#xff0c;因为自相矛盾&#xff0c;abstract 表示抽象&#xff0c;所以 abstract 修饰的类必须被实现才有意义&#xff0c;而 abstract 修饰的方法必须被覆盖重写&#xff08;即实现&#xff09;才有意义&#xff1b;但是 final 却表示最终…

zuul过滤器_Zuul 2 –样本过滤器

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

Java泛型的学习

文章目录前言泛型接口定义实现类时指定泛型具体的数据类型定义实现类时&#xff0c;泛型与接口相同泛型接口的示例代码泛型类演示代码泛型方法演示代码泛型的通配符泛型的区间限定泛型应用泛型性能注意事项前言 泛型的本质就是将数据类型参数化, 普通方法的参数值可以变&#…

html2canvas截取图片不完整,html2canvas关于图片不能一般截取

题目起首说说遇到了什么题目。起首有这么一个需求。须要前端依据后端传过来数据&#xff0c;动态的天生图片。图片中的案牍、背景图片、用户头像全部都是经由过程后端的接口猎取。然则运用 html2canvas 天生的canvas有些图片胜利的在canvas里天生了。然则有些图片无论如何都显现…

shebang_Shebang来Java了吗?

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

beetl模板引擎之自定义html标签,Beetl模板引擎自定义分页标签

1)在beetl.properties文件中配置tagTAG.page xx.xx.xx.xx.PageTag2)在模板中引用标签3)增加标签类继承自GeneralVarTagBinding类import org.beetl.core.Context;import org.beetl.core.GeneralVarTagBinding;import org.beetl.core.statement.Statement;import java.io.IOExce…

Java中常用集合类对比_集合比较

集合实现类集合接口有序性唯一性线程安全空值性能排序数据结构索引应用场景备注ArrayListList有序可重复不安全允许空值查找效率高&#xff0c;添加/删除效率低使用 Collections.sort() 传入ArrayList&#xff0c;会采用默认的方式进行排序&#xff08;字典序&#xff09;。自己…

java nio教程_Java NIO教程

java nio教程1.简介 Java NIO是Java 1.4引入的一个库。 自从Java NIO推出以来&#xff0c;它提供了另一种方法来处理I / O和网络事务。 它被认为是Java网络和Java IO库的替代方法。 开发Java NIO的目的是使输入和输出的事务异步和非阻塞。 阻塞和非阻塞IO的概念将在后面的部分…

qq html制作,jquery学习练习:制作QQ简易聊天框

使用html( )获取和设置页面内容使用val( )获取聊天内容使用addClass( )为指定元素追加样式使用数组保存聊天人员头像和昵称使用随机函数获取聊天人员的头像和昵称在输入框中输入内容&#xff0c;单击“发送”按钮&#xff0c;显示聊天内容&#xff0c;使用addClass( )为聊天内容…

IntelliJ IDEA 删除了快捷键后,如何找回来?

文章目录修改冲突快捷键删除了快捷键&#xff0c;如何找回修改冲突快捷键 删除了快捷键&#xff0c;如何找回 如上图所示&#xff0c;如果你删除了【Restore Default Layout】的快捷键后&#xff0c;如何找回来进行重新设置呢&#xff1f; 你可以按组合键【Command ,】&…

移动端设置html的字体尺寸,移动端开发元素及字体尺寸适配基础知识

刚看了一篇真正教会你开发移动端页面的文章(二)&#xff0c;文章写的很清楚&#xff0c;现总结下他的核心思想及自己所查阅的一些资料&#xff1a;假设设计稿是iPhone6(iPhone6设备像素为750px&#xff1b;设备像素比为2&#xff0c;即其适口尺寸为375px)上有200px的方块box&am…