ひがやすを技術ブログ

電通国際情報サービスのプログラマ

hiddenが消える?

JSFでhiddenで保持している項目を表示しているときに、バリデーションでエラーになってしまうと消えてしまうという問題が起きることがあります。
ここでは、S2JSFをサンプルにして説明しますが、JSFでもあてはまります。
あるデータの編集画面があり、その画面は、hogeというJavaBeansと関連付けられているとします。また、hogeにaaaというプロパティがあって、表示専用だとします。
この画面のhtmlは次のように作りがちです。


<form>
<input type="hidden" m:value="#{hoge.aaa}"/>
<span m:value="#{hoge.aaa}"/>
...
</form>
残念ながら、上記のように作ると、項目のどこかでバリデーションエラーが起きると、hoge.aaaを表示している部分が消えてしまいます。
なぜなら、hiddenで保持している項目をJavaBeans(hoge)に反映させる処理は、バリデーションがOKの場合にしか実行されないため、バリデーションエラーが起きたときは、hiddenで保持している値はJavaBeans(hoge)に反映されないためです。
じゃどうすれば良いのかというと、表示用のspanは、hiddenで保持されているリクエストのパラメータを直接参照するようにするのです。

<form id="hogeForm">
<input type="hidden" id="aaaHidden" m:value="#{hoge.aaa}"/>
<span m:value="#{param['hogeForm:aaaHidden']}"/>
...
</form>
これで、確かに、バリデーションエラーになったときに、hiddenの項目を表示できるようになりました。
でも、問題があります。画面が最初に表示されるときは、hiddenの値がリクエストで飛んでこないため、表示できないのです。
最終的な解決策は、次のようになります。

<form id="hogeForm">
<input type="hidden" id="aaaHidden" m:value="#{hoge.aaa}"/>
<span m:value="#{hoge.aaa != null ? hoge.aaa :
param['hogeForm:aaaHidden']}"/>
...
</form>
最初に画面が表示されるときは、hoge.aaaが設定されているので、それを使い、バリデーションエラーでhoge.aaaが設定されていないときには、リクエストのパラメータを使うのです。
なんだかパズルのようですね。id:shinchan55のとこの問題もこれで解決するかな。