需要更好的模板语言

时间:2012-05-09 21:28:53

标签: java templates velocity freemarker stringtemplate

是的,我知道this has been asked before。但大多数问题都是在两年前,今天必须有一个更好的答案。

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

  1. 必须可以从Java调用。

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

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

  4. 我开始让Node.js羡慕。去年Javascript有很多模板活动,但Java(我知道)很少。

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

    Java存在

    Jade,但我不希望它附带的所有HTML重新格式化。

    更新

    我最终确定了Handlebars,这也是available for Java。两者都很有效。

2 个答案:

答案 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>
}});

<强>参考