2012-05-09 20 views
8

हाँ, मुझे पता है कि thishasbeenaskedbefore। लेकिन ज्यादातर सवाल दो साल पहले थे, और आज एक बेहतर जवाब होना चाहिए।बेहतर टेम्पलेट भाषा की जरूरत

मुझे HTML प्रस्तुत करने के लिए एक टेम्पलेट भाषा की आवश्यकता है। आवश्यकताएं:

  1. जावा से कॉल करने योग्य होना चाहिए।

  2. फ्रीमार्कर, वेग, या स्ट्रिंग टेम्पलेट नहीं होना चाहिए। हम एक साल के लिए फ्रीमार्कर का उपयोग कर रहे हैं, और यह बहुत धीमी है। यह लोड के तहत हमारे CPU चक्रों का 50% उपभोग करता है। वेग फ्रीमार्कर से भी बदतर है, और स्ट्रिंग टेम्पलेट को अपने स्वयं के मुद्दे मिल गए हैं।

  3. इसे जेएसओएन, या इसके जावा समकक्ष, यानी मानचित्र, सूची और प्राइमेटिव का उपभोग करना चाहिए।

मैं नोड.जेएस ईर्ष्या प्राप्त करना शुरू कर रहा हूं। पिछले साल जावास्क्रिप्ट के लिए टेम्पलेट गतिविधि का एक टन रहा है, लेकिन जावा के लिए बहुत कम (जिसे मैं जानता हूं)।

आदर्श भाषा Liquid की तरह दिखाई देगी, जो केवल रेल के लिए मौजूद है।

Jade जावा के लिए मौजूद है, लेकिन मैं इसके साथ आने वाले सभी HTML सुधारों को नहीं चाहता हूं।

अद्यतन

मैं अंत में Handlebars पर बसे है, जो भी है available for Java। दोनों महान काम करते हैं।

+0

पहले से ही तार्किक यह सिर्फ मार्कअप stringifies में प्रश्न का बयान यह रचनात्मक कैसे हो सकता है? –

+0

फिक्स्ड। तर्कवादी होने का इरादा नहीं था। – ccleve

+0

क्या आप थोड़ा सा विस्तार कर सकते हैं कि आप वेग को फ्रीमार्कर से भी बदतर क्यों मानते हैं? मैंने कभी इस तरह के सिस्टम खपत का सामना नहीं किया है। –

उत्तर

4

Chunk जेसन-अनुकूल है। JSON को आपके कंट्रोलर कोड में टैग मान के रूप में या टेम्पलेट्स में निष्पादन/मैक्रो कॉल के लिए इस्तेमाल किया जा सकता है।

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

या, केवल आंतरिक टेम्पलेट का उपयोग करें और जावा पक्ष से जेसन इंजेक्ट करें।

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> 
+0

चंक सबसे अच्छे लोग हैं! – dns

0

Java+ एक सरल पूर्वप्रक्रमक समाधान है।

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

यह विन्यास सीमांकक है और यह लेने के बजाय जावा कोड के माध्यम से गुजरता:

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

संदर्भ