2012-05-09 31 views
8

是的,我知道thishasbeenaskedbefore。但大部分的问题都是两年前的事情,今天要有更好的答案。需要更好的模板语言

我需要用于呈现HTML的模板语言。要求:

  1. 必须从Java可调用。

  2. 不能是Freemarker,Velocity或StringTemplate。我们已经使用Freemarker一年了,速度太慢了。它在负载下消耗了50%的CPU周期。速度比Freemarker差,并且StringTemplate有它自己的问题。

  3. 它必须使用JSON或其Java等价物,即地图,列表和原语。

我开始得到Node.js的羡慕。 JavaScript在去年有很多模板活动,但对于Java来说却很少(我知道的)。

理想语言看起来像Liquid,它只存在于Rails中。

Jade对于Java而言是存在的,但我不希望所有的HTML重新格式化。

更新

我最终决定采用Handlebars,这也是available for Java。两者都很好。

+0

已经议论在问题陈述。这怎么可能是建设性的? –

+0

已修复。不打算成为议论文。 – ccleve

+0

您能详细解释一下为什么您认为Velocity比Freemarker差?我从来没有遇到过这样的系统消耗。 –

回答

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()方法返回的东西,实现了列表和地图,组块将它粘到模板正确(即使这些列表和地图嵌套更多列表和地图)。

输出:

<div>Name: whatever</div> 

<div>Friends: 

    <ul> 
    <li>bob</li> 
    <li>crystal</li> 
    </ul> 

</div> 
+0

大块是最好的家伙! – dns

0

Java+是一个简单的预处理溶液。它只是stringifies标记:

System.out.println({{ 
<html> 
    <body> 
    ... 
    </body> 
</html>}}) 

它具有可配置的分隔符,并通过Java代码通过,而不是消费它:

System.out.println({{ 
<xmlExample> 
    <name>{{fpp}}</name> 
    <number>{{bar}}</number> 
</xmlExample> 
}}); 

参考