FreeMarkerは、Javaで使えるテンプレートエンジン。
Gradleを使ったプロジェクトの場合、build.gradleのdependenciesにFreeMarkerを追加する。
apply plugin: 'java' apply plugin: 'eclipse' group = 'example' version = '0.1-SNAPSHOT' sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile group: 'org.freemarker', name : 'freemarker', version: '2.3.22' testCompile 'junit:junit:4.11' } eclipse.classpath.file { whenMerged { classpath -> classpath.entries.findAll { entry -> entry.kind == 'output' }*.path = 'classes' } }
で、Gradleのeclipseタスクを実行すれば、EclipseのプロジェクトにFreeMarkerのライブラリーが入る。
> gradle eclipse
FreeMarkerを試してみる。
まず、テンプレートファイルを作成する。(UTF-8を想定)
<#-- テスト --> テスト: ${hoge}
テンプレートを使うクラスを作成する。
package com.example.freemarker;
import java.io.IOException; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; //import freemarker.template.Version;
public class Example { public static void main(String... args) throws IOException, TemplateException { // Configuration cfg = new Configuration(new Version("2.3.22")); Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); Path srcPath = Paths.get("D:/workspace/freeMarker/src/main/templates"); cfg.setDirectoryForTemplateLoading(srcPath.toFile()); cfg.setDefaultEncoding("UTF-8"); Template template = cfg.getTemplate("example.ftl"); // データモデルを定義 Map<String, Object> dataModel = new HashMap<>(); dataModel.put("hoge", "ほげ"); // テンプレート処理 Path dstPath = Paths.get("D:/tmp/freeMarker/example.txt"); Files.createDirectories(dstPath.getParent()); try (Writer writer = Files.newBufferedWriter(dstPath, StandardCharsets.UTF_8)) { template.process(dataModel, writer); } } }
最初にConfigurationを生成し、テンプレートファイルのルートディレクトリーを指定する。
そして、Configuration#getTemplate()でテンプレートファイルを指定する。
Configuration#setDefaultEncoding()は、テンプレートファイルの(デフォルトの)エンコーディングを指定するもの。
(ちなみに、Configurationはシングルトンで使うものらしく、キャッシュが失われるので再作成せずに使い回すようだ。一度設定したら、後は読み込むだけなので、スレッドセーフで使えるらしい)
テンプレートに出力する可変データは、FreeMarkerではデータモデルと呼ぶらしい。
Mapを使うのがとりあえず一番簡単だが、JavaBeansやList、TemplateModelインターフェースを継承した各種クラスが使えるようだ。
Template#process()でデータモデルを使ってWriterに出力する。
テスト: ほげ
テンプレートファイル上で${hoge}
だった部分が、プログラム内で指定した値に変わっている。