是的,我知道this has been asked before。但大多数问题都是在两年前,今天必须有一个更好的答案。
我需要一种用于呈现HTML的模板语言。要求:
必须可以从Java调用。
不得为Freemarker,Velocity或StringTemplate。我们已经使用Freemarker一年了,而且速度太慢了。它在负载下消耗了50%的CPU周期。速度比Freemarker差,而StringTemplate也有自己的问题。
它必须使用JSON或其Java等价物,即地图,列表和基元。
我开始让Node.js羡慕。去年Javascript有很多模板活动,但Java(我知道)很少。
理想的语言看起来像Liquid,只存在于Rails中。
Java存在Jade,但我不希望它附带的所有HTML重新格式化。
更新
我最终确定了Handlebars,这也是available for Java。两者都很有效。
答案 0 :(得分:4)
Chunk对json友好。 JSON可以用作控制器代码中的标记值,也可以用作exec / macro调用的模板本身。
{% 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 %}
或者,只需使用内部模板并从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 %}
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就会将其正确地粘贴到模板中(即使这些列表和地图嵌套更多列表和地图)。
输出:
<div>Name: whatever</div>
<div>Friends:
<ul>
<li>bob</li>
<li>crystal</li>
</ul>
</div>
答案 1 :(得分:0)
Java+是一个简单的预处理器解决方案。它只标记了标记:
System.out.println({{
<html>
<body>
...
</body>
</html>}})
它具有可配置的分隔符并传递Java代码而不是使用它:
System.out.println({{
<xmlExample>
<name>{{fpp}}</name>
<number>{{bar}}</number>
</xmlExample>
}});
<强>参考强>