
टाइप-सेफ जावा मस्टैच टेम्पलेटिंग इंजन जिसमें कंपाइल-टाइम टेम्पलेट सत्यापन, स्टैटिक वैल्यू बाइंडिंग और HTML तथा अन्य सामग्री प्रकारों के लिए एक्सटेंसिबल एस्केपिंग शामिल है।
एक प्रकार-सुरक्षित जावा मस्टैच टेम्पलेटिंग इंजन।
टेम्पलेट्स को पढ़ने योग्य जावा स्रोत कोड में संकलित किया जाता है और मान बाइंडिंग्स स्थिर रूप से जाँची जाती हैं।
दस्तावेज़ javadoc.io पर भी है लेकिन ऊपर के समान एकत्रित नहीं है। एकत्रित javadoc पसंदीदा दस्तावेज़ है और इस readme का शेष भाग मुख्य रूप से प्रचार विपणन उद्देश्यों के लिए है।
पिछले रिलीज़ के लिए:
https://jstach.io/doc/jstachio/VERSION/apidocs
जहाँ VERSION आपकी इच्छित संस्करण है।
इसमें शामिल है why_jstachio_is_better.md।
तर्कहीन Mustache (v 1.3) सिंटैक्स।
आज JEP 430 जैसा समर्थन प्राप्त करें लेकिन और भी अधिक शक्ति के साथ।
टेम्पलेट्स को जावा कोड में संकलित किया जाता है
मान बाइंडिंग्स स्थिर रूप से जाँची जाती हैं।
विधियाँ, फ़ील्ड्स और गेटर-विधियाँ टेम्पलेट्स में संदर्भित की जा सकती हैं।
संदर्भ के साथ मैत्रीपूर्ण त्रुटि संदेश।
शून्य कॉन्फ़िगरेशन। किसी प्लगइन या ट्वीक की आवश्यकता नहीं है। सब कुछ किसी भी IDE और/या बिल्ड-सिस्टम के साथ मानक javac के साथ किया जाता है।
गैर-HTML टेम्पलेट्स समर्थित हैं। समर्थित एस्केपिंग सामग्री प्रकारों का सेट विस्तार योग्य है।
Mustache इनहेरिटेंस स्पेक के माध्यम से लेआउट समर्थित हैं।
ServiceLoader के माध्यम से फ़ॉलबैक रेंडर सेवा विस्तार बिंदु
अनुमत प्रकारों को अनुकूलित करें जिन्हें आउटपुट किया जा सकता है अन्यथा कंपाइलर त्रुटि (उन क्लासेस पर toString से बचने के लिए जिनके पास मैत्रीपूर्ण toString नहीं है)।
रनटाइम पर चर के कस्टम toString के लिए फ़ॉर्मेटर
ट्रेट जैसे ऐड-ऑन के लिए जनरेटेड कोड में अतिरिक्त implements इंटरफ़ेस जोड़ें (@JStacheInterfaces)
शक्तिशाली लैम्ब्डा समर्थन
Map<String, ?> समर्थन
Optional<?> समर्थन
JMustache और Handlebars सूची सूचकांक एक्सटेंशन के साथ संगत (जैसे -first, -last, -index)
यह अब तक का सबसे तेज़ जावा Mustache-जैसा टेम्पलेट इंजन है और सामान्य रूप से सबसे तेज़ में से एक है।
JStachio के अलावा शून्य निर्भरताएँ
एक बिल्कुल शून्य रनटाइम निर्भरता विकल्प उपलब्ध है (जैसे सभी आवश्यक कोड उत्पन्न होता है और रनटाइम के दौरान jstachio की भी आवश्यकता नहीं होती)। एनोटेशन प्रोसेसर और अन्य शून्य निर्भरता प्रोजेक्ट्स के लिए Maven shade का उपयोग करने की आवश्यकता नहीं है। Graal VM नेटिव प्रोजेक्ट्स के लिए भी उपयोगी है जहाँ फ़ुटप्रिंट यथासंभव न्यूनतम हो।
Spring Framework के लिए प्रथम श्रेणी का समर्थन (जैसे स्वयं प्रोजेक्ट प्लगइन्स प्रदान करेगा, न कि एक सहायक प्रोजेक्ट)
यह इस प्रोजेक्ट का लक्ष्य नहीं है कि वह सबसे तेज़ जावा टेम्पलेटिंग इंजन हो!
(हालाँकि जब यह readme अंतिम बार अपडेट किया गया था तब यह मेरी जानकारी में सबसे तेज़ है)
ऐसा नहीं है कि टेम्पलेटिंग भाषाओं के साथ प्रदर्शन बहुत मायने रखता है (यह शायद ही कभी अड़चन होता है) लेकिन JStachio बहुत तेज़ है:


@JStache(template = """
{{#people}}
{{message}} {{name}}! You are {{#ageInfo}}{{age}}{{/ageInfo}} years old!
{{#-last}}
That is all for now!
{{/-last}}
{{/people}}
""")
public record HelloWorld(String message, List<Person> people) implements AgeLambdaSupport {
}
public record Person(String name, LocalDate birthday) {
}
public record AgeInfo(long age, String date) {
}
public interface AgeLambdaSupport {
@JStacheLambda
default AgeInfo ageInfo(Person person) {
long age = ChronoUnit.YEARS.between(person.birthday(), LocalDate.now());
String date = person.birthday().format(DateTimeFormatter.ISO_DATE);
return new AgeInfo(age, date);
}
}
@Test
public void testPerson() throws Exception {
Person rick = new Person("Rick", LocalDate.now().minusYears(70));
Person morty = new Person("Morty", LocalDate.now().minusYears(14));
Person beth = new Person("Beth", LocalDate.now().minusYears(35));
Person jerry = new Person("Jerry", LocalDate.now().minusYears(35));
String actual = JStachio.render(new HelloWorld("Hello alien", List.of(rick, morty, beth, jerry)));
String expected = """
Hello alien Rick! You are 70 years old!
Hello alien Morty! You are 14 years old!
Hello alien Beth! You are 35 years old!
Hello alien Jerry! You are 35 years old!
That is all for now!
""";
assertEquals(expected, actual);
}
<properties>
<io.jstach.version>0.6.0-SNAPSHOT</io.jstach.version>
</properties>
...
<dependencies>
<dependency>
<groupId>io.jstach</groupId>
<artifactId>jstachio</artifactId>
<version>${io.jstach.version}</version>
</dependency>
</dependencies>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source> <!-- 17 is the minimum -->
<target>17</target> <!-- 17 is the minimum -->
<annotationProcessorPaths>
<path>
<groupId>io.jstach</groupId>
<artifactId>jstachio-apt</artifactId>
<version>${io.jstach.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
नोट: एनोटेशन jar (jstachio-annotation) परोक्ष रूप से खिंच जाता है
dependencies {
implementation 'io.jstach:jstachio:VERSION'
annotationProcessor 'io.jstach:jstachio-apt:VERSION'
}
{{#name}}
<p>Name: {{.}}, Name Length is {{length}}</p>
{{/name}}
<p>Age: {{ age }}</p>
<p>Achievements:</p>
<ul>
{{#array}}
<li>{{.}}</li>
{{/array}}
</ul>
{{^array}}
<p>No achievements</p>
{{/array}}
<p>Items:</p>
<ol>
{{#list1}}
<li>{{value}}</li>
{{/list1}}
</ol>
निम्नलिखित क्लास का उपयोग उपरोक्त टेम्पलेट में भरने के लिए वास्तविक डेटा प्रदान करने के लिए किया जा सकता है।
@JStache(
// points to src/main/resources/user.mustache file
path = "user.mustache",
// or alternatively you can inline the template
template = "",
)
public record User(String name, int age, String[] array, List<Item<String>> list) {
public static class Item<T> {
private final T value;
public Item(T value) {
this.value = value;
}
T value() {
return value;
}
}
}
उपरोक्त कोड के साथ नई क्लास UserRenderer यांत्रिक रूप से उत्पन्न होगी। इस क्लास का उपयोग वास्तविक डेटा से भरे टेम्पलेट को रेंडर करने के लिए किया जा सकता है। टेम्पलेट रेंडर करने के लिए निम्नलिखित कोड का उपयोग किया जा सकता है:
class Main {
public static void main(String[] args) throws IOException {
User user = new User("John Doe", 21, new String[] {"Knowns nothing"}, list);
StringBuilder appendable = new StringBuilder();
JStachio.render(user, appendable);
}
}
इस कोड को चलाने का परिणाम होगा
<p>Name: John Doe, Name Length is 8</p>
<p>Age: 21</p>
<p>Achievements:</p>
<ul>
<li>Knowns nothing</li>
</ul>
<p>Items:</p>
<ol>
<li>helmet</li>
<li>shower</li>
</ol>
गैर-मौजूद फ़ील्ड्स, या गैर-रेंडर करने योग्य प्रकार वाले फ़ील्ड्स का संदर्भ देने से संकलन-समय की त्रुटियाँ होती हैं। ये त्रुटियाँ आपके प्रोजेक्ट के संकलन-समय पर जावा स्रोतों में अन्य संभावित त्रुटियों के साथ रिपोर्ट की जाती हैं।
target/classes/user.mustache:5: error: Field not found in current context: 'age1'
<p>Age: {{ age1 }} ({{birthdate}}) </p>
^
symbol: mustache directive
location: mustache template
target/classes/user.mustache:5: error: Unable to render field: type error: Can't render data.birthdate expression of java.util.Date type
<p>Age: {{ age }} ({{birthdate}}) </p>
^
symbol: mustache directive
location: mustache template
अधिक उदाहरणों के लिए test/examples प्रोजेक्ट देखें।
मूलतः, एनम में बूलियन कुंजियाँ होती हैं जो एनम का नाम (Enum.name()) होती हैं जिन्हें सशर्त अनुभागों के रूप में उपयोग किया जा सकता है।
मान लें कि light एक एनम है जैसे:
public enum Light {
RED,
GREEN,
YELLOW
}
आप पैटर्न मैच की तरह एनम पर सशर्त रूप से चयन कर सकते हैं:
{{#light.RED}}
STOP
{{/light.RED}}
{{#light.GREEN}}
GO
{{/light.GREEN}}
{{#light.YELLOW}}
Proceeed with caution
{{/light.YELLOW}}
JStachio iterable अनुभागों के लिए हैंडलबार्स और JMustache दोनों सूचकांक कुंजियों के साथ संगत है।
-first एक बूलियन है जो सत्य है जब आप पहले आइटम पर हैं-last एक बूलियन है जो सत्य है जब आप iterable में अंतिम आइटम पर हैं-index एक-आधारित सूचकांक है। पहला आइटम 1 होगा न कि 0JStachio JMustache के समान तरीके से लैम्ब्डा अनुभाग कॉल का समर्थन करता है। बस अपनी विधियों को @JStacheLambda से टैग करें और लौटाए गए मॉडल का उपयोग लैम्ब्डा अनुभाग की सामग्री को रेंडर करने के लिए किया जाएगा। संदर्भ स्टैक के शीर्ष को लैम्ब्डा में पारित किया जा सकता है।
JStachio, स्पेक के विपरीत, गतिशील टेम्पलेट लौटाने का समर्थन नहीं करता है जो फिर संदर्भ स्टैक के विरुद्ध रेंडर होते हैं। हालाँकि, कॉल करने वाले द्वारा लैम्ब्डा अनुभाग की सामग्री को बदलकर गतिशील आउटपुट प्राप्त किया जा सकता है क्योंकि अनुभाग की सामग्री एक इनलाइन टेम्पलेट के रूप में कार्य करती है।
विचार mustache की तर्कहीन दर्शन को जावा की एकल-जिम्मेदारी और स्थिर-टाइपिंग के साथ मिलाकर एक टेम्पलेटिंग इंजन बनाना है। सिंटैक्स और डेटा-बाइंडिंग की पूर्ण संकलन-समय जाँच मुख्य आवश्यकता है।
वर्तमान में टेम्पलेट्स के लिए जावा-कोड उत्पन्न किया जाता है। उत्पन्न जावा-कोड को कभी भी संकलित होने में विफल नहीं होना चाहिए। यदि किसी टेम्पलेट से मान्य जावा-कोड उत्पन्न करना असंभव है, तो टेम्पलेट फ़ाइल की ओर इशारा करते हुए मैत्रीपूर्ण संकलन-समय त्रुटि उत्पन्न की जानी चाहिए। उपयोगकर्ताओं को कभी भी उत्पन्न जावा-कोड से अवगत नहीं कराया जाना चाहिए।
मूल mustache रेंडरिंग संदर्भ को परिभाषित करने के लिए Javascript-ऑब्जेक्ट का उपयोग करता है। चयनित Javascript-ऑब्जेक्ट के फ़ील्ड टेम्पलेट फ़ील्ड के साथ बंधे होते हैं।
स्थिर mustache रेंडरिंग संदर्भ को परिभाषित करने के लिए Java-ऑब्जेक्ट का उपयोग करता है। टेम्पलेट फ़ील्ड का बाइंडिंग संकलन-समय पर परिभाषित और जाँचा जाता है। गायब फ़ील्ड संकलन-समय त्रुटि हैं।
JStachio BSD 3-क्लॉज लाइसेंस के अंतर्गत है।