是的,我知道, 这 已 被 要求 之前 。 但大多数的问题是在两年前,和我们有了今天更好的答案。
我需要渲染HTML模板语言。 要求:
必须从Java调用。
切不可的Freemarker,Velocity,或者StringTemplate的。 我们已经使用了Freemarker了一年,它的速度太慢。 它消耗负载下,我们的CPU周期的50%。 速度比Freemarker的差,StringTemplate的得到了自己的问题。
它必须使用JSON,或者它的Java相同,即地图,列表和原语。
我开始变得Node.js的羡慕。 已经有一吨在去年为Javascript模板活动,但很少对Java(据我所知)。
理想的语言看起来像液体 ,只存在于轨道上。
玉存在的Java,但我不希望所有随之而来的HTML格式转换。
更新
我最终决定采用把手 ,这也可用于Java 。 这两个工作的伟大。
块是JSON友好。 JSON可以在你的控制器代码或模板本身被用作标记值的exec /宏调用。
{% 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()方法返回的东西,实现了列表和地图,组块会正确地把它粘到模板(即使这些列表和地图巢多个列表和地图)。
输出:
<div>Name: whatever</div>
<div>Friends:
<ul>
<li>bob</li>
<li>crystal</li>
</ul>
</div>
Java的+是一个简单的预处理器解决方案。 它只是stringifies标记:
System.out.println({{
<html>
<body>
...
</body>
</html>}})
它具有可配置的分隔符,并通过Java代码通过,而不是消费它:
System.out.println({{
<xmlExample>
<name>{{fpp}}</name>
<number>{{bar}}</number>
</xmlExample>
}});
参考