
Typsicheres Java-Mustache-Templating-Engine mit Kompilierzeit-Template-Validierung, statischer Wertbindung und erweiterbarem Escaping für HTML und andere Inhaltstypen.
Eine typsichere Java-Mustache-Template-Engine.
Templates werden in lesbaren Java-Quellcode kompiliert und Wertbindungen werden statisch geprüft.
Die Dokumentation ist auch auf javadoc.io verfügbar, aber nicht so aggregiert wie die obige.
Das aggregierte Javadoc ist die bevorzugte Dokumentation, und der Rest dieser README dient hauptsächlich Propaganda Marketingzwecken.
Für frühere Versionen:
https://jstach.io/doc/jstachio/VERSION/apidocs
Wobei VERSION die gewünschte Version ist.
Behandelt in why_jstachio_is_better.md.
Logiklose Mustache (v 1.3)-Syntax.
Erhalten Sie JEP 430-ähnliche Unterstützung bereits heute, aber mit noch mehr Leistungsfähigkeit.
Templates werden in Java-Code kompiliert
Wertbindungen werden statisch geprüft.
Methoden, Felder und Getter-Methoden können in Templates referenziert werden.
Verständliche Fehlermeldungen mit Kontext.
Keine Konfiguration. Es sind keine Plugins oder Anpassungen erforderlich. Alles wird mit standardmäßigem javac in jeder IDE und/oder jedem Build-System erledigt.
Nicht-HTML-Templates werden unterstützt. Die Menge der unterstützten Escaping-Inhaltstypen ist erweiterbar.
Layouts werden über die Mustache-Vererbungsspezifikation unterstützt.
Erweiterungspunkt für Fallback-Rendering über ServiceLoader
Passen Sie die zulässigen Typen an, die ausgegeben werden können, andernfalls Compilerfehler (um toString bei Klassen zu vermeiden, die kein freundliches toString haben).
Formatter für benutzerdefiniertes toString von Variablen zur Laufzeit
Fügen Sie dem generierten Code zusätzliche implements-Schnittstellen für trait-artige Add-ons hinzu (@JStacheInterfaces)
Leistungsstarke Lambda-Unterstützung
Map<String, ?>-Unterstützung
Optional<?>-Unterstützung
Kompatibel mit den Listenindex-Erweiterungen von JMustache und Handlebars (wie -first, -last, -index)
Es ist mit Abstand die schnellste Java-Mustache-ähnliche Template-Engine und zugleich eine der schnellsten überhaupt.
Keine Abhängigkeiten außer JStachio selbst
Es ist eine Option mit absolut null Laufzeitabhängigkeiten verfügbar (d. h. der gesamte benötigte Code wird generiert und nicht einmal jstachio wird zur Laufzeit benötigt). Keine Notwendigkeit, Maven Shade für Annotation-Processor und andere Zero-Dependency-Projekte zu verwenden. Auch nützlich für native Graal-VM-Projekte, um einen möglichst minimalen Fußabdruck zu erzielen.
Erstklassige Unterstützung für Spring Framework (das Projekt selbst stellt also Plugins bereit, im Gegensatz zu einem Hilfsprojekt)
Es ist nicht das Ziel dieses Projekts, die schnellste Java-Template-Engine zu sein!
(es ist jedoch derzeit die schnellste, die mir bekannt ist, als diese README zuletzt aktualisiert wurde)
Nicht, dass Leistung bei Template-Sprachen eine große Rolle spielt (sie ist selten der Flaschenhals), aber JStachio ist sehr schnell:
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. Das Annotations-JAR (jstachio-annotation) wird transitiv eingebunden
dependencies {
implementation 'io.jstach:jstachio:VERSION'
annotationProcessor 'io.jstach:jstachio-apt:VERSION'
}
{{#name}}
<p>Name: {{.}}, Name Length is {{length}}</p>
{{/name}}