需要更好的模板语言

ccl*_*eve 8 java templates velocity freemarker stringtemplate

是的,我知道, 要求 之前.但大多数问题是两年前的问题,今天必须有一个更好的答案.

我需要一种用于呈现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,它也可用于Java.两者都很棒.

Tom*_*ure 4

Chunk对 json 友好。JSON 可以用作控制器代码中的标记值或用于执行/宏调用的模板本身。

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

或者,只需使用内部模板并从 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 %}
Run Code Online (Sandbox Code Playgroud)

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 );
Run Code Online (Sandbox Code Playgroud)

只要 getJsonXXX() 方法返回实现 List 和 Map 的内容,Chunk 就会将其正确粘合到模板中(即使这些 List 和 Map 嵌套更多 List 和 Map)。

输出:

Theme theme = new Theme();
Chunk html = theme.makeChunk("example");

html.set("name", "whatever");
html.set("vitals", getJsonArray() );
html.set("friends", getJsonFriendObjects() );

html.render( out );
Run Code Online (Sandbox Code Playgroud)