2012-05-09 11 views
8

Sì, so che thishasbeenaskedbefore. Ma la maggior parte delle domande erano due anni fa e oggi deve esserci una risposta migliore.È necessario un linguaggio modello migliore

Ho bisogno di un linguaggio modello per il rendering HTML. Requisiti:

  1. Deve essere richiamabile da Java.

  2. Non deve essere Freemarker, Velocity o StringTemplate. Usiamo Freemarker da un anno, ed è troppo lento. Consuma il 50% dei nostri cicli della CPU sotto carico. La velocità è peggiore di Freemarker e StringTemplate ha i suoi problemi.

  3. Deve utilizzare JSON o il suo equivalente Java, ad esempio Mappe, Elenchi e primitive.

Sto iniziando a ottenere invidia Node.js. C'è stata una tonnellata di attività template per Javascript nell'ultimo anno, ma poco per Java (che io sappia).

La lingua ideale sarebbe Liquid, che esiste solo per Rails.

Jade esiste per Java, ma non voglio tutto il codice HTML che viene fornito con esso.

Aggiornamento

alla fine ho regolamento il Handlebars, che è anche available for Java. Entrambi funzionano alla grande.

+0

Già argomentativo in dichiarazione di domanda. Come può essere costruttivo? –

+0

corretto. Non intendevo essere polemico. – ccleve

+0

Potresti approfondire un po 'il motivo per cui consideri Velocity come peggiore di Freemarker? Non ho mai riscontrato tali consumi di sistema con esso. –

risposta

4

Chunk è json-friendly. JSON può essere utilizzato come valore di tag nel codice del controller o nei modelli stessi per le chiamate 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 %} 

Oppure utilizzare la maschera interna e iniettare il json dal lato 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); 

Finché il getJsonXXX() metodi restituiscono qualcosa che implementa List e Map, Chunk sarà incollarlo nella modello corretto (anche se tali elenchi e mappe annidano più elenchi e mappe).

uscita:

<div>Name: whatever</div> 

<div>Friends: 

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

</div> 
+0

Chunk è il migliore! – dns

0

Java+ è una soluzione semplice preprocessore.E 'stringifies solo markup:

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

Ha delimitatori configurabili e passa attraverso il codice Java piuttosto che consumarla:

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

Riferimenti

Problemi correlati