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

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

如何使用Spring和Thymeleaf轻松地在HTML表单映射上显示多个复选框_第1张图片

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

如何使用Spring和Thymeleaf轻松地在HTML表单映射上显示多个复选框_第2张图片

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

package net.codejava
 
import java.util.*;
import javax.persistence.*
 
@Entity
@Table(name = "users")
public class User {
     
     
    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id")
            )
    private Set roles = new HashSet<>();
     
}

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

package net.codejava;
 
import javax.persistence.*;
 
@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
 
    // getters and setters are not shown
     
    @Override
    public String toString() {
        return this.name;
    }
 
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Role other = (Role) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }  
}

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

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

package net.codejava;
 
@Controller
public class UserController {
 
    @Autowired
    private UserServices service;
     
    @Autowired
    private RoleRepository roleRepository;
     
    @GetMapping("/users/new")
    public ModelAndView newUser() {
        User user = new User();
        ModelAndView mav = new ModelAndView("user_form");
        mav.addObject("user", user);
         
        List roles = (List) roleRepository.findAll();
         
        mav.addObject("allRoles", roles);
         
        return mav;    
    }  
     
    @GetMapping("/users/edit/{id}")
    public ModelAndView editUser(@PathVariable(name = "id") Integer id) {
        User user = service.get(id);
        ModelAndView mav = new ModelAndView("user_form");
        mav.addObject("user", user);
         
        List roles = (List) roleRepository.findAll();
         
        mav.addObject("allRoles", roles);
         
        return mav;
    }  
}

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

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

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

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

如何使用Spring和Thymeleaf轻松地在HTML表单映射上显示多个复选框_第3张图片

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

如何使用Spring和Thymeleaf轻松地在HTML表单映射上显示多个复选框_第4张图片

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

你可能感兴趣的:(java,servlet,spring)