当前位置: 首页 > 知识库问答 >
问题:

Spring Boot、Thymeleaf、ManyToMany复选框评估

张敏达
2023-03-14
@Entity
@Table(name = "users")
public class User implements Serializable{

private static final long serialVersionUID = 1L;    
...

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "user_usertypes", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "usertype_id", referencedColumnName = "id"))
private Set<UserType> userTypes;
}
@Entity
@Table(name = "usertypes")
public class UserType implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Version
@Column(name = "version")
private Integer version;

@Column(name = "name")
private String name;

@ManyToMany(mappedBy = "userTypes")
private Set<User> users;

@Override
public int hashCode() {
    int hash = 5;
    hash = 83 * hash + Objects.hashCode(this.id);
    return hash;
}

@Override
public boolean equals(Object obj) {
    System.out.println("comparing objects");
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()){
        return false;
    }
    final UserType other = (UserType) obj;
    return Objects.equals(this.id, other.id);
}
}
@Controller
public class UserController {
    @RequestMapping(value = "/user", method = RequestMethod.POST)
public String saveUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "users/userform";
    }
    System.out.println(user.getUserTypes());
    userService.saveUser(user);
    return "redirect:/user/" + user.getId();
}

@InitBinder
private void initBinder(ServletRequestDataBinder binder) {

    binder.registerCustomEditor(Set.class, "userTypes", new CustomCollectionEditor(Set.class) {
        protected Object convertElement(Object element) {
            if (element != null) {
                System.out.println("From Controller: " + element.toString());
                return userTypeService.findOne(Integer.parseInt(element.toString()));
            }
            return null;
        }

    });
}
<form th:object="${user}" th:action="@{/user}" method="post">
<input type="hidden" th:field="*{id}"/>
<ul>
   <li th:each="type : ${types}">
     <input type="checkbox"  th:id="${type.id}" th:field="*{userTypes}" th:value="${type.id}"/>
     <label th:for="${type.id}" th:text="${type.name}">name</label>
   </li>
 </ul>
<form>

提交时不调用initBinder。仅在页面加载时。因此,我的控制器无法获得userTypes对象。少了什么?谢谢!

共有1个答案

微生啸
2023-03-14

我找到了一个简单快捷的解决办法。可能,不是最好的一个,但它的工作预期。希望,它会帮助到某人。

用户实体:

private List<UserType> userTypes = new ArrayList<>();

在控制器中,我创建了一个帮助器,它为当前用户创建一个新列表,以匹配表单上的索引:

public String edit(@PathVariable Integer id, Model model) {
    model.addAttribute("user", updatedTypes(userService.getUserById(id)));
    model.addAttribute("types", userTypeService.getAllUserTypes());
    return "users/userform";
}

private User updatedTypes(User user) {
    List<UserType> userTypes = new ArrayList<>();
    for (long i = 0; i < userTypeService.count(); i++) {
        userTypes.add(new UserType());
    }
    for (UserType type : user.getUserTypes()) {
        userTypes.add(type.getId() - 1, type);
    }
    user.setTypes(userTypes);
    return user;
}
 <li th:each="type, stat : ${types}">
     <input type="checkbox" th:field="*{userTypes[__${stat.index}__]}"
           th:value="${type.id}"/>
     <label th:for="|userTypes${stat.index}|+1" th:text="${type.name}">
           name
     </label>
 </li>
 类似资料:
  • 两个问题。 我有User和Note类。用户可以有许多笔记。如何通过Thymeleaf显示属于用户的每个便笺的id?th:text=“${u.notes.id}”不起作用 我有一个表(见图),其中包含每个具有布尔isUserChecked值的用户的复选框,下面是删除选中用户的按钮。Thymeleaf更正显示isUserChecked值的状态。Delete按钮在手动选中checkbox时不起作用,但在

  • 我在*.html的顶部有这个复选框。我想在“表单”中使用“ischecked”输入的值,比如将1/0(true/false)设置为隐藏输入:

  • 问题内容: 我的CSS和Thymeleaf有问题。 在我的Spring启动应用程序中,我具有以下结构: src / main / resource / static / css(用于CSS文件) src / main / resource / static / templates(用于html文件) 现在,使用我的Thymeleaf,将我的html页面命名为ErrorPage,将css文件命名为L

  • 这会找到我想要的节点吗?如果没有,我如何获得节点并正确地更改属性? 谢谢。马格努斯

  • 我如何从html中的复选框接收true或false,并将Thymeleaf传送到我的控制器,这样我就可以接收true或false的值并保存在我的数据库中。到目前为止,我收到以下错误: 我的html如下所示: 和我的控制器: 更新#1 所以我只是尝试从html中移动第二个th:字段,所以它看起来像这样:

  • 我试图创建一个表单,该表单顶部有一个复选框,当用户选中该复选框时,它会选择其他特定的复选框,但不是所有复选框。我很难通过反复试验或搜索找到答案。我唯一能找到的就是“全选”选项。不是我想要的。 理想情况下,当用户选中“管理包”旁边的复选框时,我想要“Chrome外观组”和“远程启动” 下面是代码和我在这方面的基本尝试,但它不起作用。提前谢谢。 超文本标记语言: Javascript 我不知道这个Ja