2012-05-09 18 views
8

Tak, wiem, że thishasbeenaskedbefore. Ale większość pytań pojawiła się dwa lata temu i dzisiaj musi być lepsza odpowiedź.Potrzebny jest lepszy język szablonowy

Potrzebuję języka szablonowego do renderowania HTML. Wymagania:

  1. Musi być możliwe wywołanie z Javy.

  2. Nie może to być Freemarker, Velocity ani StringTemplate. Używamy Freemarkera od roku i jest zbyt wolny. Zużywa 50% naszych cykli procesora pod obciążeniem. Prędkość jest gorsza niż Freemarker, a StringTemplate ma swoje własne problemy.

  3. Musi zużywać JSON lub jego odpowiednik w Javie, tj. Maps, List i prymitywów.

Zaczynam zazdrościć Node.js. W zeszłym roku odnotowano mnóstwo zmian w szablonach dla JavaScript, ale niewiele w przypadku języka Java (o którym wiem).

Idealny język będzie wyglądał jak Liquid, który istnieje tylko dla Rails.

istnieje dla Javy, ale nie chcę całego formatowania HTML, który jest z nim związany.

Aktualizacja

I ostatecznie rozstrzygane na Handlebars, który jest również available for Java. Oba działają świetnie.

+0

Już kłótliwy w oświadczenie. Jak to może być konstruktywne? –

+0

Naprawiono. Nie zamierzałem być kłótliwy. – ccleve

+0

Czy mógłbyś nieco wyjaśnić, dlaczego uważasz Velocity za gorszego od Freemarkera? Nigdy nie spotkałem się z takim zużyciem systemu. –

Odpowiedz

4

Chunk jest przyjazny dla użytkownika json. JSON może być używany jako wartość znacznika w kodzie kontrolera lub samych szablonach dla wywołań 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 %} 

Lub po prostu użyj wewnętrznego szablonu i wstrzyknij json ze strony 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); 

Dopóki getJsonXXX(), która implementuje metody coś wykaz i mapa powrócić, Chunk będzie przykleić go do szablon poprawnie (nawet jeśli te listy i mapy zagnieżdżają więcej list i map).

wyjściowa:

<div>Name: whatever</div> 

<div>Friends: 

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

</div> 
+0

Chunk jest najlepszymi facetami! – dns

0

Java+ to proste rozwiązanie preprocesora.To właśnie stringifies markup:

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

Posiada konfigurowalne separatory i przechodzi przez kod Java zamiast spożywania go:

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

Referencje

Powiązane problemy