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