【问题标题】:Better template language needed [closed]需要更好的模板语言[关闭]
【发布时间】:2012-05-18 10:56:43
【问题描述】:

是的,我知道thishasbeenaskedbefore。但大多数问题都是两年前的问题,今天一定会有更好的答案。

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

  1. 必须可从 Java 调用。

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

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

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

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

Jade 存在于 Java 中,但我不希望随之而来的所有 HTML 重新格式化。

更新

我最终选择了Handlebars,这也是available for Java。两者都很好用。

【问题讨论】:

  • 已经在问题陈述中争论不休。这怎么可能是建设性的?
  • 已修复。不打算争论。
  • 您能否详细说明一下为什么您认为 Velocity 比 Freemarker 差?我从来没有遇到过这样的系统消耗。
  • 您可以使用 SpEL(Spring 表达式语言)。与 Velocity 或 Freemarker 相比,它快速、稳定并且拥有更多现代运算符。
  • 我必须同意 ddekany(和 Claude)的观点。我已经使用 Freemarker 和 Velocity 多年,但从未听说过 50% 的 CPU。你做错事的几率非常高。检查你的循环,也许。

标签: java templates velocity freemarker stringtemplate


【解决方案1】:

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

或者,只需使用内部模板并从 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>

【讨论】:

  • Chunk 是最棒的人!
【解决方案2】:

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

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

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

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

参考文献

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多