最近参画したプロジェクトで、Javaのソースを見ているとftlファイルというあまり見慣れない拡張子のファイルと出会うことがありました。調べてみたところFreeMarker Template Languageという言語で書かれており、Javaベースのテンプレートエンジンに基づいており、割と古くからある技術のようなので今回はそれについて説明したいと思います。
FreeMakerの目的としてはftlファイルというテンプレートファイルに対して、Javaのプログラム側でパラメータを渡すことで、出力内容を動的に変更する仕組みになっています。私が調べたところ、テンプレートファイルを使用してhtmlファイルを生成することによりフロント開発に役立てるという用法が多いようです。
例えば、テンプレートファイルに以下のような記述をしたとします。
<html>
<body>
私は${username}です。
</body>
</html>
これに対してJavaのプログラム側でusername = “太郎”というパラメータを渡すことで、
「私は太郎です。」と表示されるhtmlが生成される仕組みとなっております。
上記がhtmlでの使用例となりますが、私のプロジェクトではSQLの生成にftlファイルを活用していました。パラメータを条件文の中に組み込んだり、あるいはパラメータの内容に応じてwhere句そのものを制御するためです。
SQLの動的生成のためにftlファイル独自の文法、リファレンスがあるのですが、その一部を以下で紹介していきたいと思います。
①パラメータが存在しているか確認したい。
→<#if 変数名??>
ftlではnullはエラーとなるのですが、画面やプログラム側で対象パラメータが必須でない場合、常にパラメータが渡ってくる保障はないので、パラメータの存在確認は必要になります。そのような場合に使用するのが「??」で、パラメータが存在すればtrue、存在しなければfalseを返します。
実用例としては以下のようになります。
<#if usrnm??>
mst_user = ${usrnm}
<#/if>
②パラメータが空か確認したい。
→<#if 変数名?has_content>
先ほど紹介した「??」と異なり、パラメータ自体は存在していたとして、中身が空文字や要素数0の配列を判定するのに使用するのが「?has_content」で、パラメータが空であればfalse、そうでなければtrueを返します。
両者の関係を整理すると、
・パラメータが存在しない
「??」 → false
「?has_content」 → false
・パラメータが空文字
「??」 → true
「?has_content」 → false
・パラメータが”taro”
「??」 → true
「?has_content」 → true
以上のようになります。
③パラメータが配列の場合に要素数を確認したい。
→変数名?size
①、②ほど実用性はありませんが、私自身が少し使う機会があったので紹介します。
気を付けなければならないのはパラメータが存在しなければ、当然要素数も取得できないので、「?size」の使用前に「??」で存在確認を行う必要があります。
実用例としては以下のようになります。
<#if usrnmlist??>
<#if usrnmlist?size lt 2>
<#/if>
<#/if>
※ltは不等号の「<」です。そのまま「<」を記述してしまうと、プログラムがタグの<>
と誤認する危険性があるのでlt(<)やgt(>)で記述する方が安全です。
FreeMakerについての説明は以上となります。みなさんが今後ftlファイルに出会ったときにこの記事が作業の一助となれば幸いです。
それでは、 See you next time👉