logic:equalをcタグで置き換える時の注意点

Java

Struts → Spring に置き換えている時にlogic:equalタグにひどく悩まされました。

<logic:equal name="hogeForm" property="hogeProperty" value="">

hogeFormのhogePropertyがvalue属性で指定した値に等しければ真となります。
なので僕は

<c:if test="${hogeForm.hogeProperty == ''}"   >

と置き換えました。
しかし、動作確認をすると同じ動きをしません。
hogeFormのhogePropertyがNullの場合、

<logic:equal name="hogeForm" property="hogeProperty" value="">

はなぜか真になるのです。
Nullと空文字を比較しているはずのに真になるのでとても困惑しました。


原因

結論から言うとlogic:equalタグの仕様でした。
タグの実装クラスを読んでいると

if(variable == null) variable = "";

という部分があり、variable変数にはPropertyの取得値が入っています。
このvariableを最終的にValue属性で指定した値と比較していました。
つまりPropertyの取得値がNullの場合、
勝手に空文字に変換されます。
なので一見、Nullと空文字を比較しているように見えても真になるのです。
そういうややこしい処理やめて……。


対処

Propertyの取得値がNullと空文字の場合は真になるので、
下記のようにしました。

<c:if test="${empty hogeForm.hogeProperty}"   >

まとめ

Strutsタグが妙な動きをしている時、
実装クラスを読むのは大事だということが分かりました。
ググれば出てくると思っていたのですが、
結局、読んだほうが早かったです。

Java

Posted by raishin