• 如何使用Spring和Thymeleaf轻松地在HTML表单映射上显示多个复选框


    在这篇快速文章中,我将与您分享一些代码示例,以使用Spring MVC和百里叶以HTML形式显示多个复选框。复选框的值与一个集合进行映射,该集合是模型类的字段。例如,您希望对如下所示的用户窗体进行编码:

    用户可以具有一个或多个(多个)角色,因此此窗体中的“角色”字段由与数据库中的角色名称对应的多个复选框表示。在数据库中,我们有3个表来实现用户和角色之间的多对多关系,如下所示:

    在Java代码中,我们创建实体类User如下(我只在这篇文章的上下文中显示相关代码):

    1. package net.codejava
    2. import java.util.*;
    3. import javax.persistence.*
    4. @Entity
    5. @Table(name = "users")
    6. public class User {
    7. @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
    8. @JoinTable(
    9. name = "users_roles",
    10. joinColumns = @JoinColumn(name = "user_id"),
    11. inverseJoinColumns = @JoinColumn(name = "role_id")
    12. )
    13. private Set roles = new HashSet<>();
    14. }

    你看,User类有一角色s。您应该重写角色类中的字符串()等于()和哈希代码(),如下所示:

    1. package net.codejava;
    2. import javax.persistence.*;
    3. @Entity
    4. @Table(name = "roles")
    5. public class Role {
    6. @Id
    7. @GeneratedValue(strategy = GenerationType.IDENTITY)
    8. private Integer id;
    9. private String name;
    10. // getters and setters are not shown
    11. @Override
    12. public String toString() {
    13. return this.name;
    14. }
    15. @Override
    16. public int hashCode() {
    17. final int prime = 31;
    18. int result = 1;
    19. result = prime * result + ((id == null) ? 0 : id.hashCode());
    20. return result;
    21. }
    22. @Override
    23. public boolean equals(Object obj) {
    24. if (this == obj)
    25. return true;
    26. if (obj == null)
    27. return false;
    28. if (getClass() != obj.getClass())
    29. return false;
    30. Role other = (Role) obj;
    31. if (id == null) {
    32. if (other.id != null)
    33. return false;
    34. } else if (!id.equals(other.id))
    35. return false;
    36. return true;
    37. }
    38. }

    我们需要重写toString()方法,以便角色名称将显示在表单中。并且必须覆盖等于()哈希码(),以便当表单处于编辑模式时,Spring MVC和Thymeleaf将正确显示复选标记。对于Spring数据JPA存储库接口,即用户存储库角色存储库 - 没有什么特别的。我们不必编写任何额外的代码。

    在Spring MVC控制器类中,我们需要对处理程序进行编码以创建新用户并编辑现有用户,如下所示:

    1. package net.codejava;
    2. @Controller
    3. public class UserController {
    4. @Autowired
    5. private UserServices service;
    6. @Autowired
    7. private RoleRepository roleRepository;
    8. @GetMapping("/users/new")
    9. public ModelAndView newUser() {
    10. User user = new User();
    11. ModelAndView mav = new ModelAndView("user_form");
    12. mav.addObject("user", user);
    13. List roles = (List) roleRepository.findAll();
    14. mav.addObject("allRoles", roles);
    15. return mav;
    16. }
    17. @GetMapping("/users/edit/{id}")
    18. public ModelAndView editUser(@PathVariable(name = "id") Integer id) {
    19. User user = service.get(id);
    20. ModelAndView mav = new ModelAndView("user_form");
    21. mav.addObject("user", user);
    22. List roles = (List) roleRepository.findAll();
    23. mav.addObject("allRoles", roles);
    24. return mav;
    25. }
    26. }

    这里的关键点是将角色对象的集合添加到模型中:

    1. List roles = (List) roleRepository.findAll();
    2. mav.addObject("allRoles", roles);

    并且在Thymeleaf的视图中,编写用于显示复选框的代码,如下所示:

    1. <form th:action="@{/users/save}" th:object="${user}" method="post">
    2. <p>
    3. <label>Roles:
    4. <input type="checkbox" name="roles"
    5. th:each="role : ${allRoles}"
    6. th:text="${role.name}"
    7. th:value="${role.id}"
    8. th:field="*{roles}"
    9. />
    10. label>
    11. p>
    12. form>

    然后在创建新模式下, 它将显示与数据库中的角色名称相对应的带有标签的复选框:

    我们不必为保存用户处理程序方法编写任何特殊代码,因为Spring MVC,Thymeleaf和Spring Data JPA在自动持久化User对象和关联角色对象方面做得非常出色。在编辑模式下,它将根据用户和角色之间的关联正确显示复选标记,例如:

    这是一些代码示例,说明如何使用Spring和Thymeleaf轻松地在HTML表单映射上显示多个复选框,其中包含数据库中的值。我希望这篇文章对您有所帮助。

  • 相关阅读:
    Unity初学者肯定能用得上的50个小技巧
    18.5 重载全局new、delete、定位new及重载等
    单场GMV翻了100倍,冷门品牌崛起背后的“通用法则”是什么?
    LED显示屏出现马赛克有哪些原因
    阅读 | 003《知识图谱发展报告2022》(一)知识表示与建模
    性能测试 —— Tomcat监控与调优:status页监控
    k8s-13 存储之secret
    CEC2013(MATLAB):猎豹优化算法(The Cheetah Optimizer,CO)求解CEC2013
    功能强大性能更佳的 Sass 常用指令
    你不能错过的【Python爬虫】测试2(完整源代码+架构+结果)
  • 原文地址:https://blog.csdn.net/allway2/article/details/127512220