2012-05-09 10 views
8

はい、私はそれが知っていますthishasbeenaskedbeforeです。しかし、質問の大部分は2年前のことでしたが、今日はより良い答えが得られるはずです。よりよいテンプレート言語が必要

HTMLのレンダリングにテンプレート言語が必要です。要件:

  1. Javaから呼び出し可能である必要があります。

  2. Freemarker、Velocity、またはStringTemplateであってはなりません。私たちはFreemarkerを1年間使用してきましたが、それは遅すぎます。 CPU負荷の50%を消費します。速度はFreemarkerよりも悪く、StringTemplateには独自の問題があります。

  3. JSON、またはそれに相当するJavaのマップ、リスト、およびプリミティブを使用する必要があります。

私はNode.jsの羨望を始めています。昨年のJavascriptには1トンのテンプレート・アクティビティがありましたが、Javaについてはほとんど分かりませんでした。

理想的な言語は、Liquidのようになります。これはRailsにのみ存在します。

JadeがJava用ですが、それに付属するすべてのHTML再フォーマットは欲しくないです。

更新

私は最終的にもavailable for Javaである、Handlebarsに落ち着きました。両方とも素晴らしいです。

+0

すでに議論ただ、マークアップがstringifies 〜で問題の声明どのように建設的なことができますか? –

+0

修正済み。議論するつもりはありませんでした。 – ccleve

+0

VelocityをFreemarkerよりも悪いと考える理由を少し詳しく説明できますか?私はそのようなシステム消費に遭遇したことはありません。 –

答えて

4

Chunkはjson-friendlyです。 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+は、単純なプリプロセッサのソリューションです。

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

それは設定可能区切り文字を持っており、それを消費するのではなく、Javaコードを通過:

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

参照

関連する問題