チェックボックスで値を送信するときは、nameとvalueの組み合わせが一緒のものがあると、どの値がチェックされて送信されているのかが不明になります。
ですので、nameに番号をつけるか、valueに番号をつけるかのどちらかになりますが、簡単なのは valueに番号をつけることです。
html
1<div th:each="check, iterStat : ${checks}">
2 <input type="checkbox" name="checks" th:checked="${check}" th:value="${iterStat.index}">
3</div>
こうすることで、例えば checks の内容が
java
1List<Boolean> checks = Arrays.asList(Boolean.TRUE, Boolean.FALSE);
の場合には、上記のhtmlテンプレートは、以下のように出力されます。
html
1<div>
2 <input type="checkbox" name="checks" checked="checked" value="0">
3 <input type="checkbox" name="checks" value="1">
4</div>
これを送信したものを受け取るControllerでは、例えば
java
1 @PostMapping("")
2 public ModelAndView post(ModelAndView mnv, @RequestParam(required=false) List<Integer> checks) {
3 log.info(checks);
4
5 if (checks == null) {
6 checks = new ArrayList<>();
7 }
8
9 List<Boolean> outputChecks = outputChecks(checks);
10
11 mnv.setViewName("checkbox");
12 mnv.addObject("checks", outputChecks);
13 return mnv;
14 }
15
16 private List<Boolean> outputChecks(List<Integer> checks) {
17 return IntStream.range(0, 2).boxed().map(i -> checks.contains(i)).collect(Collectors.toList());
18 }
とすれば何番目のチェックボックスに対してチェックされているのかが確認できるでしょう。
このControllerでは、チェックボックスの最大サイズを2と固定していますが、表示されているチェックボックスの数も受け取れるようにすれば良いでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。