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

前回に引き続き、FreeMarker Template Language(以下 FTL)のお話です。

今回は、FreeMarkerで用意されているFTLタグのディレクティブのうち、制御構造に関するものを紹介しようと思います。

条件分岐

条件分岐は、ifディレクティブまたはswitchディレクティブを使用して行います。

ifディレクティブについては、前回もちょっと出てきましたね。他の言語と同様、elseelseifを追加することも可能です。

<#if nationality != "日本">
  日本国籍が必要です。
<#elseif age < 20>
  未成年者は投票できません。
<#else>
  矢印に沿ってお進みください。
</#if>

switchディレクティブも、他の言語にあるものとほとんど変わりません。比較するのが数値に限らず、文字列などでもオッケーなのがうれしいですね。(Javaも次のバージョンで出来るようになるみたいですが。。)

<#switch dept>
  <#case "外科">
    診察室は1番です。
    <#break>
  <#case "内科">
    診察室は2番です。
    <#break>
  <#default>
    しばらくお待ちください。
</#switch>

繰り返し

繰り返しはlistディレクティブを使用して行います。

listディレクティブは、この連載の第2回で出てきましたね。パラメータとして渡されたコレクションの要素数ぶん、ループします。

<#assign items=["金", "銀", "パール"]>

<#list items as x>
  ${x} プレゼント♪
</#list>

この例の場合、

  金 プレゼント♪
  銀 プレゼント♪
  パール プレゼント♪

と、表示されます。

listディレクティブの中では、暗黙的にふたつの特殊な変数が用意されます。ひとつめは、「パラメータで指定した変数名 + _index」という名前で定義される、ループのインデックスです。

<#list items as x>
  ${x_index}: ${x} プレゼント♪
</#list>

この場合、

  0: 金 プレゼント♪
  1: 銀 プレゼント♪
  2: パール プレゼント♪

と、表示されます。勝手に変数名を作られるのは少々気持ち悪いですが、実用上は便利です。

ふたつめは、「パラメータで指定した変数名 + _has_next」という名前で定義される、ループの最後かどうかを返すフラグです。

<#list items as x>${x}<#if x_has_next>、</#if></#list>
プレゼント♪

この例は、

金、銀、パール
プレゼント♪

と、表示されます。

ところで、前回シーケンスのリテラルのところで書いてなかったのですが、数値のシーケンスは「0..10」のように範囲を指定したリテラル表記も可能です。これもLLっぽくていいですね。

これを使うと、他の言語のfor文ぽいものも書けます。

<#list 1..3 as i>
  ${i}年生
</#list>
  1年生
  2年生
  3年生