需要更好的模板语言

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

我需要一种用于呈现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 。 两者都很棒。

Chunk对 json友好。 JSON可以用作控制器代码中的标记值,也可以用作exec / macro调用的模板本身。

{% exec %} {% data @json %} { name: "whatever", vitals: ["an","array","of","data"], friends: [{name: "bob"},{name: "crystal"}] } {% enddata %} 
Name: {$name}
{% if ($friends) %}
Friends:
    {% loop in $friends as $friend %}
  • {$friend.name}
  • {% endloop %}
{% endif %} {% endexec %}

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

SRC /主题/ example.chtml

  
Name: {$name}
{% if ($friends) %}
Friends:
    {% loop in $friends as $friend %}
  • {$friend.name}
  • {% endloop %}
{% 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就会将其正确地粘贴到模板中(即使这些列表和地图嵌套更多列表和地图)。

输出:

 
Name: whatever
Friends:
  • bob
  • crystal

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

 System.out.println({{   ...  }}) 

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

 System.out.println({{  {{fpp}} {{bar}}  }}); 

参考

  • Java +预处理器2.0版:语法