checkboxはcheckが入っていないとサーバーに値自体送信されない
ということに今更気づきました。
これだと、チェックが入っているかどうかでtrue/falseの値を送信したいときに困ります。
何か賢い方法があるかと探してみましたが、基本的にはスクリプトで何とかするほかない様子。
または、SpringMVCのformが使用出来ればそれが一番みたいです。
以下、方法のメモです。
input/type/hiddenを用意しoffの情報を送信
この方法をWebで一番見かけました。
- input type=checkboxと組みでinput type=hiddenを用意
- チェックを入れた場合はcheckboxのvalueの値を送信
- チェックを入れない場合はhiddenのvalueを送信
ただし、2でそのまま値を送信すると、checkboxとhidden両方の値がカンマ区切りでvalueとして送信されてしまいます。なので、2のときはhiddenの要素をdisableにする必要があります。
逆に、3ではcheckboxの要素をdisableにする必要はありません。チェックが入っていないと値が送信されない仕様のためです。
html
<div id="parent"> <input type="hidden" id="hidden_checkboxTest1" name="checkboxTest1"/> <input type="checkbox" name="checkboxTest1" /> <input type="hidden" id="sample" name="checkboxTest2"/> <input type="checkbox" name="checkboxTest2" /> </div>
js
/*checkboxes*/ initilizeCheckBoxes(); $('#parent input[type="checkbox"]').click(function(){ switchBoolOfCheckbox($(this)); }); /* * Send true if checked. Send false if unchecked. */ function switchBoolOfCheckbox(checkboxInput){ var name = checkboxInput.attr("name");//ex. checkboxTest1 var hiddenInput = $("#hidden_" + name); if(checkboxInput.prop('checked')){ hiddenInput.attr('disabled', 'disabled'); checkboxInput.val('true'); }else{ hiddenInput.removeAttr('disabled');//hiddenのタグを有効にする hiddenInput.val('false'); } } /* * Judge by checkbox value sent from server. */ function initilizeCheckBoxes(){ $('#parent input[type="checkbox"]').each(function(){ var name = checkboxInput.attr("name"); var hiddenInput = $("#hidden_" + name); if($(this).val() == 'true'){//valueにサーバーから値を送信しておく $(this).attr("checked", "checked"); hiddenInput.attr('disabled', 'disabled'); }else{ $(this).removeAttr("checked"); hiddenInput.removeAttr('disabled'); hiddenInput.val('false'); } }); }
Spring MVCのform:checkboxは自動でhidden要素を生成してくれる
のです。
つまり、上記のスクリプトの処理をSpringがやってくれます。
下記のようなコードを書くと、
<form:checkbox path="springCheckboxTest" />
実際には以下のような要素が生成されます。
<input type="checkbox" value="true" name="springCheckboxTest" id="springCheckboxTest"> <input type="hidden" value="on" name="_springCheckboxTest">
hiddenの要素のname属性の先頭に"_"が付いていることが、Springがfalseの値をハンドリングする目印になっているそうです。
参考:Spring Refference -The checkbox tag