2012-05-09 8 views
8

Sí, sé que thishasbeenaskedbefore. Pero la mayoría de las preguntas fueron hace dos años, y hoy debe haber una mejor respuesta.Mejor lenguaje de plantilla necesario

Necesito un lenguaje de plantilla para representar HTML. Requisitos:

  1. Debe ser invocable desde Java.

  2. No debe ser Freemarker, Velocity o StringTemplate. Hemos estado usando Freemarker durante un año, y es demasiado lento. Consume el 50% de nuestros ciclos de CPU bajo carga. La velocidad es peor que Freemarker, y StringTemplate tiene sus propios problemas.

  3. Debe consumir JSON o su equivalente Java, es decir, Mapas, Listas y primitivas.

Estoy empezando a obtener Node.js envy. Ha habido un montón de actividad de plantilla para Javascript en el último año, pero poco para Java (que yo sepa).

El lenguaje ideal sería Liquid, que existe solo para Rails.

Jade existe para Java, pero no quiero todo el reformateo HTML que viene con él.

actualización

que finalmente se estableció en Handlebars, que también es available for Java. Ambos funcionan bien.

+0

Ya argumentativa en declaración de pregunta. ¿Cómo puede ser esto constructivo? –

+0

Reparado. No tenía la intención de ser argumentativo. – ccleve

+0

¿Podría explicar un poco por qué considera que Velocity es peor que Freemarker? Nunca me he encontrado con tales consumos del sistema. –

Respuesta

4

Chunk es json-friendly. JSON se puede usar como un valor de etiqueta en el código de su controlador o en las propias plantillas para llamadas de exec/macro.

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

O, simplemente use la plantilla interna e inyecte el json del lado de java.

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); 

Mientras el getJsonXXX() métodos devuelven algo que implementa la lista y el mapa, Chunk pegarán en el plantilla correctamente (incluso si esas listas y mapas anidan más listas y mapas).

de salida:

<div>Name: whatever</div> 

<div>Friends: 

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

</div> 
+0

¡Chunk es los mejores chicos! – dns

0

Java+ es una solución preprocesador simple.Sólo stringifies marcado:

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

que tiene delimitadores configurables y pasa a través del código de Java en lugar de consumirla:

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

Referencias

Cuestiones relacionadas