タイトルは大分釣りですけど!夏ですし!おすし!
そっかーこういう挙動すんのかーこえーと思ったので覚え書き。
ある変数において、デフォルト値の予約語「!」と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}
今年の夏は、こわくない!