checkboxはcheckが入っていないとサーバーに値自体送信されない

ということに今更気づきました。
これだと、チェックが入っているかどうかでtrue/falseの値を送信したいときに困ります。
何か賢い方法があるかと探してみましたが、基本的にはスクリプトで何とかするほかない様子。
または、SpringMVCのformが使用出来ればそれが一番みたいです。
以下、方法のメモです。

input/type/hiddenを用意しoffの情報を送信

この方法をWebで一番見かけました。

  1. input type=checkboxと組みでinput type=hiddenを用意
  2. チェックを入れた場合はcheckboxのvalueの値を送信
  3. チェックを入れない場合は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