需要更好的模板语言
是的,我知道以前 曾经问过 这个 问题 。 但大多数问题是两年前的问题,今天必须有一个更好的答案。
我需要一种用于呈现HTML的模板语言。 要求:
-
必须可以从Java调用。
-
不能是Freemarker,Velocity或StringTemplate。 我们已经使用Freemarker一年了,而且速度太慢了。 它在负载下消耗了50%的CPU周期。 速度比Freemarker差,而StringTemplate也有自己的问题。
-
它必须使用JSON或其Java等价物,即地图,列表和基元。
我开始让Node.js羡慕。 去年Javascript的模板活动很多,但Java(我知道)很少。
理想的语言看起来像Liquid ,它只存在于Rails中。
Jade存在于Java中,但我不希望它附带的所有HTML重新格式化。
更新
我最终选择了Handlebars ,它也可以用于Java 。 两者都很棒。
Chunk对 json友好。 JSON可以用作控制器代码中的标记值,也可以用作exec / macro调用的模板本身。
{% exec %} {% data @json %} { name: "whatever", vitals: ["an","array","of","data"], friends: [{name: "bob"},{name: "crystal"}] } {% enddata %} Name: {$name} {% if ($friends) %} Friends: {% loop in $friends as $friend %} - {$friend.name}
{% endloop %}
{% endif %} {% endexec %}
或者,只需使用内部模板并从java端注入json。
SRC /主题/ example.chtml
Name: {$name} {% if ($friends) %} Friends: {% loop in $friends as $friend %} - {$friend.name}
{% endloop %}
{% endif %}
MyController.java
Theme theme = new Theme(); Chunk html = theme.makeChunk("example"); html.set("name", "whatever"); html.set("vitals", getJsonArray() ); html.set("friends", getJsonFriendObjects() ); html.render( out );
只要getJsonXXX()方法返回实现List和Map的内容,Chunk就会将其正确地粘贴到模板中(即使这些列表和地图嵌套更多列表和地图)。
输出:
Name: whatever Friends: - bob
- crystal
Java +是一个简单的预处理器解决方案。 它只是将标记字符串化:
System.out.println({{ ... }})
它具有可配置的分隔符,并通过Java代码而不是使用它:
System.out.println({{ {{fpp}} {{bar}} }});
参考
- Java +预处理器2.0版:语法
- 如何从Freemarker模板访问Java系统属性?
- 如何使用FreeMarker模板化嵌套的Pojos?
- 沙盒Java / Groovy / Freemarker代码 – 防止执行特定方法
- 下拉框 – 从Spring MVC模型/上下文到使用freemarker形成
- 在Spring应用程序中从FreeMarker获取模板文本
- Freemarker模板中的JSP标记
- 使用freemarker生成html以在电子邮件中发送,无论如何使用渲染的jsp页面?
- Freemarker和Struts 2,有时候它会计算为序列+ extended_hash
- 在Freemarker模板中检查Spring安全角色和已记录的用户名