
Motor de plantillas Mustache para Java con seguridad de tipos, validación de plantillas en tiempo de compilación, enlace de valores estático y escape extensible para HTML y otros tipos de contenido.
Un motor de plantillas Mustache para Java con seguridad de tipos.
Las plantillas se compilan en código fuente Java legible y los enlaces de valores se verifican estáticamente.
La documentación también está en javadoc.io pero no está agregada como la anterior.
El javadoc agregado es la documentación preferida y el resto de este readme
es principalmente para fines de propaganda marketing.
Para versiones anteriores:
https://jstach.io/doc/jstachio/VERSION/apidocs
Donde VERSION es la versión que desees.
Cubierto en why_jstachio_is_better.md.
Sintaxis Mustache sin lógica (v 1.3) de Mustache.
Obtén soporte similar a JEP 430 hoy pero con aún más poder.
Las plantillas se compilan en código Java
Los enlaces de valores se verifican estáticamente.
Métodos, campos y métodos getter pueden referenciarse en las plantillas.
Mensajes de error amigables con contexto.
Configuración cero. No se requieren plugins ni ajustes. Todo se hace con javac estándar con cualquier IDE y/o sistema de construcción.
Se admiten plantillas no HTML. El conjunto de tipos de contenido de escape admitidos es extensible.
Se admiten diseños mediante la especificación de herencia de Mustache.
Punto de extensión del servicio de renderizado de respaldo mediante ServiceLoader
Personaliza los tipos permitidos que se pueden generar de lo contrario error del compilador (para evitar toString en clases que no tienen un toString amigable).
Formateador para toString personalizado de variables en tiempo de ejecución
Añade interfaces implements adicionales al código generado para complementos tipo trait (@JStacheInterfaces)
Soporte potente de Lambdas
Soporte de Map<String, ?>
Soporte de Optional<?>
Compatible con las extensiones de índice de lista de JMustache y Handlebars (como -first, -last, -index)
Es, por mucho, el motor de plantillas Mustache-like más rápido de Java, así como uno de los más rápidos en general.
Cero dependencias aparte de JStachio mismo
Una opción de dependencia de tiempo de ejecución absolutamente cero está disponible (es decir, todo el código necesario se genera y ni siquiera se necesita jstachio durante el tiempo de ejecución). No es necesario usar Maven shade para procesadores de anotaciones y otros proyectos con cero dependencias. También útil para proyectos nativos de Graal VM para la huella más pequeña posible.
Soporte de primera clase para Spring Framework (es decir, el proyecto mismo proporcionará plugins en lugar de un proyecto auxiliar)
¡No es un objetivo de este proyecto ser el motor de plantillas Java más rápido!
(sin embargo, actualmente es el más rápido que conozco cuando este readme fue actualizado por última vez)
No es que el rendimiento importe mucho con los lenguajes de plantillas (rara vez es el cuello de botella) pero JStachio es muy rápido:
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 es el mínimo -->
<target>17</target> <!-- 17 es el mínimo -->
<annotationProcessorPaths>
<path>
<groupId>io.jstach</groupId>
<artifactId>jstachio-apt</artifactId>
<version>${io.jstach.version}</version>
</path>
<!-- otros procesadores de anotaciones -->
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
N.B. El jar de anotaciones (jstachio-annotation) se incluye 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>