Mustache.java는 신뢰할 수 없는 당사자가 템플릿을 제공하는 것을 허용하도록 설계되지 않았습니다. 안전하게 제공하기 위해 잠그는 것이 가능할 수도 있지만 기본적으로는 UNSAFE입니다. SafeMustacheFactory를 사용하고 모든 템플릿과 부분을 화이트리스트에 추가하세요.
릴리스 0.9.0부터 mustache.java는 이제 Java 8 전용입니다. Java 6/7 지원을 위해서는 0.8.x를 사용하십시오.
외부 종속성은 없으며 컴파일러 라이브러리는 ~100k입니다.
Mustache.java 는 mustache.js의 파생물입니다.
지원 및 질문을 위한 Google 그룹이 있습니다: http://groups.google.com/group/mustachejava
Github CI: https://github.com/spullara/mustache.java/actions/workflows/maven.yml
API 문서: http://spullara.github.io/mustache/apidocs/
Mustache.java의 최대 규모 프로덕션 배포:
많은 성능 개선을 위해 YourKit에 감사드립니다.
YourKit은 모든 기능을 갖춘 Java 프로파일러를 통해 mustache.java 오픈 소스 프로젝트를 친절하게 지원합니다. YourKit, LLC는 Java 및 .NET 애플리케이션 프로파일링을 위한 혁신적이고 지능적인 도구를 만드는 회사입니다. YourKit의 주요 소프트웨어 제품을 살펴보세요:
기부 요청:
선적 서류 비치:
mustache
사양 테스트를 모듈로 공백 차이를 통과합니다.Iterable
목록과 유사한 동작에 사용될 수 있습니다.Callable
을 반환하면 ExecutorService
구성된 경우 동시 평가가 가능합니다.{{<super}}{{$content}}...{{/content}}{{/super}}
).{{#func1}}...{{/func1}}
)는 Java 8의 Function
(대체 후)를 사용하여 구현됩니다.TemplateFunction
사용하십시오(대체 전).handlebar
서버는 디자이너가 템플릿을 빠르게 모형화할 수 있도록 템플릿 + json 데이터를 렌더링합니다.CapturingMustacheVisitor
사용하여 라이브 시스템에서 샘플 데이터를 가져올 수 있습니다.invert
호출은 텍스트와 템플릿을 가져와 데이터를 해결할 수 있습니다.성능:
compiler
모듈의 com.github.mustachejavabenchmarks
패키지를 참조하세요.indy
모듈은 codegen 모듈과 Invokedynamic을 사용하여 템플릿을 바이트코드로 컴파일합니다.빌드 제안:
Maven 종속성 정보(즉, 가장 일반적인 경우에는 compiler
모듈만 있으면 됩니다):
자바 8+:
< dependency >
< groupId >com.github.spullara.mustache.java</ groupId >
< artifactId >compiler</ artifactId >
< version >0.9.10</ version >
</ dependency >
자바 6/7:
< dependency >
< groupId >com.github.spullara.mustache.java</ groupId >
< artifactId >compiler</ artifactId >
< version >0.8.18</ version >
</ dependency >
예제 템플릿 파일:
{{#items}}
Name: {{name}}
Price: {{price}}
{{#features}}
Feature: {{description}}
{{/features}}
{{/items}}
일부 백업 코드로 구동될 수 있습니다.
public class Context {
List < Item > items () {
return Arrays . asList (
new Item ( "Item 1" , "$19.99" , Arrays . asList ( new Feature ( "New!" ), new Feature ( "Awesome!" ))),
new Item ( "Item 2" , "$29.99" , Arrays . asList ( new Feature ( "Old." ), new Feature ( "Ugly." )))
);
}
static class Item {
Item ( String name , String price , List < Feature > features ) {
this . name = name ;
this . price = price ;
this . features = features ;
}
String name , price ;
List < Feature > features ;
}
static class Feature {
Feature ( String description ) {
this . description = description ;
}
String description ;
}
}
결과는 다음과 같습니다.
Name: Item 1
Price: $19.99
Feature: New!
Feature: Awesome!
Name: Item 2
Price: $29.99
Feature: Old.
Feature: Ugly.
템플릿 평가는 순차적으로 진행됩니다. 예를 들어 콜백 중 하나에 차단 코드가 있는 경우 해당 코드를 실행하는 동안 시스템이 일시 중지됩니다.
static class Feature {
Feature ( String description ) {
this . description = description ;
}
String description () throws InterruptedException {
Thread . sleep ( 1000 );
return description ;
}
}
대신 Callable
을 반환하도록 설명을 변경하면 MustacheFactory
를 생성할 때 ExecutorService
제공한 경우 별도의 스레드에서 자동으로 실행됩니다.
Callable < String > description () throws InterruptedException {
return new Callable < String >() {
@ Override
public String call () throws Exception {
Thread . sleep ( 1000 );
return description ;
}
};
}
이를 통해 예약된 작업, 스트리밍 동작 및 비동기 I/O가 가능합니다. 완전한 엔드투엔드 예제를 보려면 example
모듈을 확인하세요.
package mustachejava ;
import com . github . mustachejava . DefaultMustacheFactory ;
import com . github . mustachejava . Mustache ;
import com . github . mustachejava . MustacheFactory ;
import java . io . IOException ;
import java . io . PrintWriter ;
import java . io . Writer ;
import java . util . Arrays ;
import java . util . List ;
public class Example {
List < Item > items () {
return Arrays . asList (
new Item ( "Item 1" , "$19.99" , Arrays . asList ( new Feature ( "New!" ), new Feature ( "Awesome!" ))),
new Item ( "Item 2" , "$29.99" , Arrays . asList ( new Feature ( "Old." ), new Feature ( "Ugly." )))
);
}
static class Item {
Item ( String name , String price , List < Feature > features ) {
this . name = name ;
this . price = price ;
this . features = features ;
}
String name , price ;
List < Feature > features ;
}
static class Feature {
Feature ( String description ) {
this . description = description ;
}
String description ;
}
public static void main ( String [] args ) throws IOException {
MustacheFactory mf = new DefaultMustacheFactory ();
Mustache mustache = mf . compile ( "template.mustache" );
mustache . execute ( new PrintWriter ( System . out ), new Example ()). flush ();
}
}
변수를 제공하는 또 다른 접근 방식은 다음과 같이 Map 객체를 사용하는 것입니다.
public static void main ( String [] args ) throws IOException {
HashMap < String , Object > scopes = new HashMap < String , Object >();
scopes . put ( "name" , "Mustache" );
scopes . put ( "feature" , new Feature ( "Perfect!" ));
Writer writer = new OutputStreamWriter ( System . out );
MustacheFactory mf = new DefaultMustacheFactory ();
Mustache mustache = mf . compile ( new StringReader ( "{{name}}, {{feature.description}}!" ), "example" );
mustache . execute ( writer , scopes );
writer . flush ();
}