FreeMarker Template Language 入門(2)

パッケージJava製品開発担当の大です。こんにちは。

前回に引き続き、FreeMarker Template Language(以下 FTL)の紹介をしようと思います。

今回は、FTLで記述するテンプレートを構成する4つの要素、「インターポレーション」「FTLタグ」「コメント」「テキスト」について書きます。

インターポレーション

前回のサンプルのテンプレート(greeting.ftl)をもう一度見てみましょう。

こんにちは、 ${user}さん!

${user}」の部分が、指定されたデータに置き換わるんでしたね。

このように、「${」と「}」で囲まれたものは、「インターポレーション(interpolation: 差し挟むこと、書き入れなどの意味)」と呼ばれます。

${」と「}」の間には、が入ります。式にはいろいろな種類があります。リテラルの値、変数、数式、メソッド呼び出しなどです。

例:

${3 + 4}
${"hogehoge"?upper_case}

これらは、以下のような出力結果になります。

7
HOGEHOGE

式の種類については、後日まとめて解説したいと思います。

FTLタグ

こんどはリストを含むデータをテンプレートに渡して、順に処理してみましょう。
以下のプログラム(FoodMenu.java)では、Foodオブジェクトのリストをテンプレート(menu.ftl)に渡して、簡単なフードメニューを作成します。

FoodMenu.java:

package test;

import java.io.File;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;


public class FoodMenu {
	public static void main(String[] args) throws Exception {
		Map<String, Object> root = new HashMap<String, Object>();
		List<Food> menu = new ArrayList<Food>();
		menu.add(new Food("ひつまぶし", 2750));
		menu.add(new Food("味噌煮込み", 1260));
		menu.add(new Food("手羽先5本", 400));
		root.put("menu", menu);
		process("menu.ftl", root);
	}

	public static class Food {
		private String name;
		private int price;
		public Food(String name, int price) {
			this.name = name;
			this.price = price;
		}
		public String getName() {
			return name;
		}
		public int getPrice() {
			return price;
		}
	}
	
	// processメソッドはGreeting.javaと同じなので省略
}

menu.ftl:

<#list menu as food>
${food.name}  ${food.price?string.currency}
</#list>

実行すると、以下のような出力結果が得られます。

ひつまぶし  ¥2,750
味噌煮込み  ¥1,260
手羽先5本  ¥400

<#list ○>~</#list>」という、XMLのタグのようなものが出てきました。これが「FTLタグ」です。
FTLタグの名前は、#あるいは@で始まります。#で始まる場合は、「list」のようにFreeMarkerで最初から用意されているディレクティブ(directive: 指示、命令などの意味)を続けて指定します。一方、@で始まる場合は、ユーザ定義のディレクティブを続けて指定します。ユーザ定義のディレクティブは、マクロとして定義することもできますし、TemplateDirectiveModelインタフェースを実装したJavaクラスを作成して定義することも可能です。

FreeMarkerで用意されている、ディレクティブには、条件分岐を行う「if」や関数を定義する「function」など、さまざまなものがあります。これらについても、今後紹介していきたいと思います。

コメント

コメント」は、「<#--」で始まり「-->」で終わります。

例:

コメントの<#-- この部分がコメントです。 -->サンプルです。
<#--
  この部分もコメントです。
  複数行に渡っても問題ありません。
 -->
コメントだけの行はデフォルトでは空行にはなりません。

このテンプレートは、以下のような出力結果になります。

コメントのサンプルです。
コメントだけの行はデフォルトでは空行にはなりません。

テキスト

「インターポレーション」「FTLタグ」「コメント」以外の部分は、「テキスト」と呼ばれます。テキストの部分については、FreeMarkerは特に処理を行わず、そのまま出力します。

FreeMarkerは汎用のテンプレートエンジンなので、処理対象のテンプレートファイルは、テキストのファイルでさえあれば何でも構いません。プレインテキストのみならず、HTMLでもJavaソースファイルでも、テンプレートとして解釈しようとします。もちろん、ファイルの拡張子も何でも構いません(「.ftl」にしておくと、FreeMarkerのEclipseプラグイン使用時に入力補完が効いたり色分けされたりなどのメリットはありますが)。

というわけで、今回はFTLで記述するテンプレートの構成を俯瞰してみました。次回以降、もう少し詳しく掘り下げてみていこうと思います。