8

是的,我知道以前有人这个 问题。但大多数问题都是两年前的问题,今天必须有更好的答案。

我需要一种模板语言来呈现 HTML。要求:

  1. 必须可以从 Java 调用。

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

  3. 它必须使用 JSON 或其 Java 等价物,即 Maps、Lists 和原语。

我开始嫉妒 Node.js。去年有大量的 Javascript 模板活动,但 Java 很少(据我所知)。

理想的语言应该是Liquid,它只存在于 Rails 中。

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

更新

我最终选择了Handlebars,它也可用于 Java。两者都工作得很好。

4

2 回答 2

4

是 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 %}

或者,只需使用内部模板并从 java 端注入 json。

src/themes/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 就会正确地将其粘贴到模板中(即使这些 List 和 Map 嵌套了更多 List 和 Map)。

输出:

<div>Name: whatever</div>

<div>Friends:

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

</div>
于 2012-10-06T01:14:40.770 回答
0

Java+是一个简单的预处理器解决方案。它只是对标记进行字符串化:

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

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

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

参考

于 2013-03-21T17:38:44.003 回答