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

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

今回は、FTLの「」について書きます。

式を使用する場所

前回、インターポレーションの説明のところで式が出てきました。

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

FTLタグのディレクティブにも、パラメータとして式を指定するものがあります。たとえば、「if」ディレクティブなどです。

こんにちは、${user}さん!
<#if numComments != 0>
  新着コメントが${numComments}件あります!
</#if>

パラメータはディレクティブによってさまざまなので、適宜リファレンスを参照しましょう。

式の種類

では、式の種類について簡単に見ていきましょう。

リテラル

値を直接指定します。LL言語っぽい配列やハッシュのリテラル記法もあります。

文字列 "hogehoge" または 'fugafuga' のように、ダブルクオートもしくはシングルクオートで囲みます。
数値 12123.45 のように書きます。指数表記(10E8 のような)はいまのところサポートされていません。
真偽値 true または false です。
配列(シーケンス) ["ローヌ", "ブルゴーニュ", "ボルドー"] のように、値(subvariables)をカンマで区切って指定します。
ハッシュ {"name":"肉まん", "price":100} のように、キーと値のペアを並べて記述します。キーは文字列である必要があります。JSONみたいですね。

演算

1つ以上のオペランドと演算子からなる式です。

算術演算 3 + 4 のような計算式です。 +-*/%(剰余)の5種類が使用できます。
比較演算 上記の例の「if」ディレクティブで指定した numComments != 0 のように、二つの値を比較する式です。<<=>>===!=が使用できます。=== と書くこともできます。
論理演算 ||(論理和)、&&(論理積)、!(否定)の3種類が使用できます。
文字列演算 文字列リテラル中では、"こんにちは、${user}さん!" のように、インターポレーションが使用できます。また、"こんにちは" + user + "さん!" のように + を使用して連結することもできます。
配列演算 ["ひつまぶし", "きしめん"] + ["味噌かつ", "味噌煮込み"] のように、配列の連結も + で出来ます。
ハッシュ演算 同様に、ハッシュも {"数学":80, "物理":65} + {"国語":25, "英語":12} のように、+ で連結できます。

ビルトイン

型ごとに、さまざまな組み込みの手続きが用意されています。ビルトインは、オペランドの後ろに?に続けて指定します。 以下の例はそれぞれ、文字列・数値・配列のビルトインの例です。

${"spring"?cap_first}
${12.4?int}
${['鳩', 'チキン', 'サギ']?size}

用意されているビルトインの一覧はこちらにあります。

変数

トップレベルの変数は、前述の例の ${user} のように単純に変数名で指定します。

変数名に使える文字は、アルファベット、数字、_(アンダーライン)、$(ドル記号)、@(アットマーク)、#(シャープ)等のほか、非ラテン文字も使用可能です。ただし、変数名は数字から始めることはできません。

前回の例の ${food.name} のように、JavaBeansのプロパティへのアクセスやハッシュの要素へのアクセスでは、.(ドット)に続けてプロパティ名/要素名を指定します。
あるいは、${food["name"]}のように書くこともできます。どちらも同じ意味です。

配列(シーケンス)の要素へのアクセスの場合は、Javaと同様に、hoge[0]と添字を指定します。

メソッド呼び出し

JavaBeansのメソッドはJavaでの記述と同じように呼び出すことが可能です。

トップレベルに登録したメソッドを呼び出す場合、 ${methodName(arg)} のように呼び出すことができます。メソッドの登録・呼び出しについては、また改めて詳しく書こうと思います。