Mustache.java は、信頼できない当事者がテンプレートを提供できるように設計されていません。それを安全に提供するためにロックダウンすることは可能かもしれませんが、デフォルトでは安全ではありません。 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
リストのような動作に使用できますExecutorService
が構成されている場合、 Callable
返すと同時評価が可能になります{{<super}}{{$content}}...{{/content}}{{/super}}
){{#func1}}...{{/func1}}
) は、Java 8 のFunction
(置換後) を使用して実装されます。TemplateFunction
を使用します。handlebar
サーバーは、デザイナーによるテンプレートの迅速なモックアップのために、テンプレートと JSON データをレンダリングします。CapturingMustacheVisitor
使用して、ライブ システムからサンプル データを抽出できます。invert
呼び出しはテキストとテンプレートを受け取り、データを解決できます。パフォーマンス:
compiler
モジュールのcom.github.mustachejavabenchmarks
パッケージを参照してください。indy
モジュールは codegen モジュールと invokedynamic を使用して、テンプレートをバイトコードにコンパイルします。ビルドの提案:
Maven の依存関係情報 (つまり、ほとんどの一般的なケースでは、 compiler
モジュールのみが必要になります):
Java 8+:
< dependency >
< groupId >com.github.spullara.mustache.java</ groupId >
< artifactId >compiler</ artifactId >
< version >0.9.10</ version >
</ dependency >
Java 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.
テンプレートの評価は逐次的に行われます。たとえば、コールバックの 1 つにブロックするコードがある場合、システムはそれらの実行中に一時停止します。
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 ();
}