ThymeleafでPOST時にListで値を送信する方法

ThymeleafでPOST時にListで値を送信する方法

ThymeleafでPOST時にListで値を送信する方法を示すサンプルコードを以下に示します。
フォームの送信、バリデーション、コントローラの処理を含めています。

HTML(Thymeleafテンプレート)

<form action="#" th:action="@{/submit}" th:object="${form}" method="post">
  <div th:each="item, iterStat : ${form.items}">
    <input type="text" th:field="*{items[__${iterStat.index}__]}" />
    <span th:if="${#fields.hasErrors('items[' + iterStat.index + ']')}"
          th:errors="*{items[__${iterStat.index}__]}"></span>
  </div>
  <button type="submit">送信</button>
</form>

コントローラ(SpringBoot)

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import javax.validation.Valid;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/submit")
public class FormController {

  @PostMapping
  public ModelAndView submitForm(@Valid @ModelAttribute("form") Form form, BindingResult result) {
    if (result.hasErrors()) {
      return new ModelAndView("form", "form", form);
    }

    // Formの処理
    return new ModelAndView("success");
  }
}

フォームクラス(Java)

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.util.List;

public class Form {

  @NotEmpty(message = "項目は空であってはなりません")
  @Size(min = 1, message = "少なくとも1つの項目が必要です")
  private List<@Size(min = 1, message = "項目は空であってはなりません") String> items;

  // ゲッターとセッター
  public List<String> getItems() {
    return items;
  }

  public void setItems(List<String> items) {
    this.items = items;
  }
}

バリデーション

1. HTMLフォーム
th:field を使用してフォーム要素にバインドします。
エラーメッセージはth:errorsで表示します。
2. コントローラ
@Valid アノテーションでフォームデータをバリデーションし、BindingResult でエラーがあればフォームを再表示します。
3. フォームクラス
@NotEmpty や @Size アノテーションを使用して、リスト内のアイテムに対するバリデーションを行います。

このコードは、フォームでListのデータを送信し、サーバー側でそのデータをバリデーションする基本的な方法を示しています。