本当は怖いftl(FreeMarker)

タイトルは大分釣りですけど!夏ですし!おすし!


そっかーこういう挙動すんのかーこえーと思ったので覚え書き。


ある変数において、デフォルト値の予約語「!」とHTMLエスケープ用built-inの「?html」を組み合わせたときの挙動の違いについてです。
まず以下のようなテストコードを用意します。

${teststr!"&"?html}

このとき、teststrが空の場合、この結果は

&

と、?htmlが効いた結果になります。まあそうね。そうだよね。


次に、teststrの値を「&&」で定義します。
このとき、同テストコードを実行すると…

&&

と、?htmlが効いていない結果となります。


えっ?
なにこれこわい。


スピリチュアルコーディングが求められる。
このままだと怖すぎるので解決するべくfreemarker.orgの方向に祈りを捧げながらテストコードを以下のように変更します。

${(teststr!"&")?html}

このとき、teststrが空の場合、この結果は

&

と、?htmlが効いた結果になります。よし。


次に、teststrの値を「&&」で定義します。
このとき、同テストコードを実行すると

&&

ヤター。?html効いたよー。


つまり、

${teststr!""}

のようにデフォルト値を明示的に指定するケースの場合、直後にbuilt-inを指定すると、built-inは指定したデフォルト値にしか効かないわけですね。
なので、変数に値が入っているケースにおいて、その値にもbuilt-inを適用する場合、括弧で囲ってやる必要があります。
こわかった。freemarker.orgに足向けて眠れません。


ちなみに、デフォルト値を指定しない場合は、以下のようなコードで十分です。

${teststr!?html}


今年の夏は、こわくない!

スポンサーリンク