
Type-safe motore di templating Mustache per Java con validazione dei template in fase di compilazione, binding statico dei valori ed escaping estensibile per HTML e altri tipi di contenuto.
Un motore di templating Java type-safe per Mustache.
I template vengono compilati in codice sorgente Java leggibile e i binding dei valori vengono controllati staticamente.
La documentazione è disponibile anche su javadoc.io ma non è aggregata come quella sopra.
La javadoc aggregata è la documentazione preferita e il resto di questo readme
è principalmente a scopo propagandistico di marketing.
Per le versioni precedenti:
https://jstach.io/doc/jstachio/VERSION/apidocs
Dove VERSION è la versione che desideri.
Trattato in why_jstachio_is_better.md.
Sintassi Mustache (v 1.3) senza logica.
Ottieni oggi un supporto simile a JEP 430, ma con ancora più potenza.
I template vengono compilati in codice Java
I binding dei valori vengono controllati staticamente.
Metodi, campi e metodi getter possono essere referenziati nei template.
Messaggi di errore amichevoli con contesto.
Zero configurazione. Non sono richiesti plugin o modifiche. Tutto viene fatto con javac standard con qualsiasi IDE e/o sistema di build.
Sono supportati template non-HTML. Il set di tipi di contenuto con escaping supportati è estensibile.
I layout sono supportati tramite la specifica di ereditarietà di Mustache.
Punto di estensione del servizio di rendering fallback tramite ServiceLoader
Personalizza i tipi consentiti che possono essere emessi, altrimenti errore del compilatore (per evitare toString su classi che non hanno un toString leggibile).
Formatter per un toString personalizzato delle variabili a runtime.
Aggiungi ulteriori interfacce implements al codice generato per componenti aggiuntivi simili a trait (@JStacheInterfaces)
Potente supporto alle lambda
Supporto a Map<String, ?>
Supporto a Optional<?>
Compatibile con le estensioni degli indici di lista di JMustache e Handlebars (come -first, -last, -index)
È di gran lunga il motore di template Java simile a Mustache più veloce, nonché uno dei più veloci in generale.
Zero dipendenze oltre a JStachio stesso
È disponibile un'opzione con zero dipendenze runtime assolute (ovvero tutto il codice necessario viene generato e durante il runtime non serve nemmeno jstachio). Non c'è bisogno di usare Maven shade per gli annotation processor e altri progetti zero dipendenze. Utile anche per progetti native di Graal VM per un footprint il più minimo possibile.
Supporto di prima classe per Spring Framework (nel senso che il progetto stesso fornirà i plugin, a differenza di un progetto ausiliario)
Non è un obiettivo di questo progetto essere il motore di template Java più veloce!
(tuttavia, al momento dell'ultimo aggiornamento di questo readme, è il più veloce che io conosca)
Non che le prestazioni contino molto con i linguaggi di templating (raramente sono il collo di bottiglia), ma JStachio è molto veloce:
https://github.com/agentgt/template-benchmark


@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>
N.B. Il jar delle annotazioni (jstachio-annotation) viene incluso transitivamente
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>