キーワード†
- 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>にマッピングされる