
Type-safe mecanismo de templates Mustache para Java com validação de templates em tempo de compilação, vinculação estática de valores e escape extensível para HTML e outros tipos de conteúdo.
Um mecanismo de templates Mustache para Java com segurança de tipos.
Os templates são compilados em código-fonte Java legível e os vínculos de valores são verificados estaticamente.
A documentação também está no javadoc.io, mas não é agregada como a acima.
O javadoc agregado é a documentação preferida e o restante deste readme
serve principalmente para propaganda fins de marketing.
Para versões anteriores:
https://jstach.io/doc/jstachio/VERSION/apidocs
Onde VERSION é a versão que você deseja.
Abordado em why_jstachio_is_better.md.
Sintaxe Mustache (v 1.3) sem lógica.
Obtenha suporte semelhante ao JEP 430 hoje, mas com ainda mais poder.
Templates são compilados em código Java
Os vínculos de valores são verificados estaticamente.
Métodos, campos e métodos getter podem ser referenciados em templates.
Mensagens de erro amigáveis com contexto.
Configuração zero. Nenhum plugin ou ajuste é necessário. Tudo é feito com o javac padrão, em qualquer IDE e/ou sistema de build.
Templates não HTML são suportados. O conjunto de tipos de conteúdo com escape suportados é extensível.
Layouts são suportados por meio da especificação de herança do Mustache.
Ponto de extensão de serviço de renderização fallback via ServiceLoader
Personalize os tipos permitidos que podem ser emitidos; caso contrário, erro do compilador (para evitar toString em classes que não possuem um toString amigável).
Formatador para toString personalizado de variáveis em tempo de execução
Adicione interfaces implements extras ao código gerado para complementos semelhantes a traits (@JStacheInterfaces)
Suporte poderoso a lambdas
Suporte a Map<String, ?>
Suporte a Optional<?>
Compatível com as extensões de índice de lista do JMustache e do Handlebars (como -first, -last, -index)
É de longe o mecanismo de templates Java semelhante a Mustache mais rápido, além de um dos mais rápidos em geral.
Zero dependências além do próprio JStachio
Uma opção de dependência de tempo de execução absolutamente zero está disponível (ou seja, todo o código necessário é gerado e nem mesmo o jstachio é necessário durante a execução). Não é necessário usar o Maven shade para processadores de anotação e outros projetos com zero dependências. Também é útil para projetos nativos do Graal VM, para uma pegada mínima possível.
Suporte de primeira classe para o Spring Framework (ou seja, o próprio projeto fornecerá plugins, em vez de um projeto auxiliar)
Não é objetivo deste projeto ser o mecanismo de templates Java mais rápido!
(no entanto, atualmente é o mais rápido que conheço quando este readme foi atualizado pela última vez)
Não que performance importe muito com linguagens de template (raramente é o gargalo), mas o JStachio é muito 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 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. O jar de anotações (jstachio-annotation) é incluído 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>
<ul>
{{#array}}
<li>{{.}}</li>
{{/array}}
</ul>
{{^array}}
<p>No achievements</p>
{{/array}}