需要更好的模板语言[关闭](Better template language needed [clo

2019-07-29 07:58发布

是的,我知道, 这 已 被 要求 之前 。 但大多数的问题是在两年前,和我们有了今天更好的答案。

我需要渲染HTML模板语言。 要求:

  1. 必须从Java调用。

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

  3. 它必须使用JSON,或者它的Java相同,即地图,列表和原语。

我开始变得Node.js的羡慕。 已经有一吨在去年为Javascript模板活动,但很少对Java(据我所知)。

理想的语言看起来像液体 ,只存在于轨道上。

玉存在的Java,但我不希望所有随之而来的HTML格式转换。

更新

我最终决定采用把手 ,这也可用于Java 。 这两个工作的伟大。

Answer 1:

块是JSON友好。 JSON可以在你的控制器代码或模板本身被用作标记值的exec /宏调用。

{% 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()方法返回的东西,实现了列表和地图,组块会正确地把它粘到模板(即使这些列表和地图巢多个列表和地图)。

输出:

<div>Name: whatever</div>

<div>Friends:

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

</div>


Answer 2:

Java的+是一个简单的预处理器解决方案。 它只是stringifies标记:

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

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

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

参考

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


文章来源: Better template language needed [closed]