
Moteur de templating Mustache Java type-safe avec validation de templates à la compilation, liaison de valeurs statique et échappement extensible pour HTML et autres types de contenu.
Un moteur de templates Java Mustache type-sûr.
Les templates sont compilés en code source Java lisible et les liaisons de valeurs sont vérifiées statiquement.
La documentation est également sur javadoc.io mais n'est pas agrégée comme ci-dessus.
La javadoc agrégée est la documentation de référence et le reste de ce readme
sert principalement à des fins de propagande marketing.
Pour les versions précédentes :
https://jstach.io/doc/jstachio/VERSION/apidocs
Où VERSION est la version souhaitée.
Traité dans why_jstachio_is_better.md.
Syntaxe Mustache (v 1.3) sans logique.
Profitez dès aujourd'hui d'un support de type JEP 430 mais avec encore plus de puissance.
Les templates sont compilés en code Java
Les liaisons de valeurs sont vérifiées statiquement.
Les méthodes, les champs et les méthodes getter peuvent être référencés dans les templates.
Messages d'erreur conviviaux avec contexte.
Zéro configuration. Aucun plugin ni ajustement requis. Tout est fait avec le javac standard avec n'importe quel IDE et/ou système de build.
Les templates non-HTML sont pris en charge. L'ensemble des types de contenu d'échappement pris en charge est extensible.
Les layouts sont pris en charge via la spécification d'héritage de Mustache.
Point d'extension du service de rendu de secours via ServiceLoader
Personnalisez les types autorisés à être générés en sortie, sinon erreur du compilateur (pour éviter toString sur des classes qui n'ont pas un toString convivial).
Formateur pour un toString personnalisé des variables à l'exécution
Ajoutez des interfaces implements supplémentaires au code généré pour des extensions de type trait (@JStacheInterfaces)
Prise en charge puissante des lambdas
Prise en charge de Map<String, ?>
Prise en charge de Optional<?>
Compatible avec les extensions d'index de liste de JMustache et Handlebars (comme -first, -last, -index)
C'est de loin le moteur de templates Java de type Mustache le plus rapide, et également l'un des plus rapides en général.
Zéro dépendance en dehors de JStachio lui-même
Une option de dépendance runtime absolument nulle est disponible (c'est-à-dire que tout le code nécessaire est généré et même jstachio n'est pas requis à l'exécution). Pas besoin d'utiliser Maven shade pour les processeurs d'annotations et autres projets zéro dépendance. Également utile pour les projets natifs Graal VM afin d'avoir une empreinte minimale.
Prise en charge de première classe pour Spring Framework (c'est-à-dire que le projet lui-même fournira des plugins, contrairement à un projet auxiliaire)
Ce projet n'a pas pour objectif d'être le moteur de templates Java le plus rapide !
(cependant, c'est actuellement le plus rapide que je connaisse au moment de la dernière mise à jour de ce readme)
Non pas que la performance importe beaucoup avec les langages de templating (ce n'est que rarement le goulot d'étranglement) mais JStachio est très rapide :
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. Le jar d'annotations (jstachio-annotation) est inclus transitivement
dependencies {
implementation 'io.jstach:jstachio:VERSION'
annotationProcessor 'io.jstach:jstachio-apt:VERSION'
}