ccl*_*eve 8 java templates velocity freemarker stringtemplate
是的,我知道,这 已 被 要求 之前.但大多数问题是两年前的问题,今天必须有一个更好的答案.
我需要一种用于呈现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 %}
{% data @json %}
{ name: "whatever",
vitals: ["an","array","of","data"],
friends: [{name: "bob"},{name: "crystal"}]
}
{% enddata %}
<div>Name: {$name}</div>
{% if ($friends) %}
<div>Friends:
<ul>
{% loop in $friends as $friend %}
<li>{$friend.name}</li>
{% endloop %}
</ul>
</div>
{% endif %}
{% endexec %}
Run Code Online (Sandbox Code Playgroud)
或者,只需使用内部模板并从 java 端注入 json。
src/主题/example.chtml
<div>Name: {$name}</div>
{% if ($friends) %}
<div>Friends:
<ul>
{% loop in $friends as $friend %}
<li>{$friend.name}</li>
{% endloop %}
</ul>
</div>
{% endif %}
Run Code Online (Sandbox Code Playgroud)
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 );
Run Code Online (Sandbox Code Playgroud)
只要 getJsonXXX() 方法返回实现 List 和 Map 的内容,Chunk 就会将其正确粘合到模板中(即使这些 List 和 Map 嵌套更多 List 和 Map)。
输出:
Theme theme = new Theme();
Chunk html = theme.makeChunk("example");
html.set("name", "whatever");
html.set("vitals", getJsonArray() );
html.set("friends", getJsonFriendObjects() );
html.render( out );
Run Code Online (Sandbox Code Playgroud)