2012-05-09 61 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> 
}}); 

參考