home wiki.fukuchiharuki.me
Menu

キーワード

  • Spring Boot
  • Thymeleaf
  • checkbox
  • Map
  • enum

したいこと

複数のチェックボックスで入力したい。例えば、権限マスタがあって、その権限マスタについてそれぞれチェックボックスを設ける、次のような。

□ 権限A □ 権限B

どうやって

マスタを用意する

enumで実装するのがよいと思う。

@AllArgsConstructor
public enum RoleType {
  ROLE_A("権限A"),
  ROLE_B("権限B");
  @Getter private String displayName;
}

フォームを作る

権限のコード値に対してオン/オフを取得するため、Map<String, Boolean>で受け取る。

@Data
public class Form {
  private Map<String, Boolean> roles;
}

コントローラでモデルを設定する

入力ページと確認ページで使えるようにメソッドで定義するのがよいと思う。

@ModelAttribute("rolesTypes")
public RoleType[] getRolesTypes() {
  return RoleType.values();
}

チェックボックスを書く

<div th:if="${#fields.hasErrors('*{roles}')}">
  <div th:errors="*{roles}"></div>
</div>

<ul>
<li th:each="roleType: ${rolesTypes}">
  <input th:id="${roleType}" type="checkbox" th:field="*{roles[__${roleType}__]}" value="on" />
  <label th:for="${roleType}" th:text="${roleType.displayName}"></label>
</li>
</ul>

ノート

ミソは、

  • enumオブジェクトを表示しようとするとname()を呼ぶのと同じになる
  • フィールドの指定は連想配列的に書ける
    • キー名は予め展開しておくため「__${roleType}__」と書く
    • それがMap<String, Boolean>にマッピングされる

参考