You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot Controller中获取复选框参数?

问题描述

我有多个复选框,想要在Controller中获取它们的参数,但尝试编写的代码无法正常运行。以下是我的相关代码:

HTML代码

<input type="checkbox" th:each="formfrequencylist : ${formfrequencylist}" th:value="${formfrequencylist.id}" th:text="${formfrequencylist.frequencyNm}"
                             th:field="${formFrequency.id}" >

Controller代码

@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping( value = "create/")
public String create( Model model) {
    RegulatoryForm regulatoryform=new RegulatoryForm();
    ActHasForm acthasform=new ActHasForm();
    FormFrequency formFrequency = new FormFrequency();
    List<RegulatoryAct> actlist=atiServiceImpl.findAllRegulatoryAct();
    List<FormFrequency> formfrequencylist=atiServiceImpl.findAllFormFrequency();
    model.addAttribute("actlist",actlist);
    model.addAttribute("regulatoryform",regulatoryform);
    model.addAttribute("acthasform",acthasform);
    model.addAttribute("formFrequency",formFrequency);
    
    model.addAttribute("formfrequencylist",formfrequencylist);
    return "regulatoryform/create";
}

@PreAuthorize("hasRole('ROLE_ADMIN')")
@PostMapping(value = "create/")
public String create(@ModelAttribute("regulatoryform") RegulatoryForm regulatoryform,@ModelAttribute("acthasform")ActHasForm acthasform,@ModelAttribute("formFrequencylist")List <FormFrequency> formFrequencylist) {
FormHasFrequency formHasFrequency=new FormHasFrequency();
atiServiceImpl.saveRegulatoryForm(regulatoryform);
acthasform.setFormId(regulatoryform);
atiServiceImpl.saveActHasForm(acthasform);
  for (FormFrequency form:formFrequencylist) {
     formHasFrequency.setFormId(regulatoryform);
     formHasFrequency.setFrequencyId(form);
    atiServiceImpl.saveFormHasFrequency(formHasFrequency);
  }
    return "redirect:/regulatoryform/";
}

修复方案

1. 修正Thymeleaf复选框绑定逻辑

当前所有复选框都绑定到formFrequency.id这个单值属性,无法传递多选结果。需要改为绑定到集合属性:

  • 先在RegulatoryForm类中添加选中ID的集合属性:
public class RegulatoryForm {
    // 原有属性保留
    private List<Long> selectedFrequencyIds;
    
    // 生成getter、setter方法
    public List<Long> getSelectedFrequencyIds() {
        return selectedFrequencyIds;
    }

    public void setSelectedFrequencyIds(List<Long> selectedFrequencyIds) {
        this.selectedFrequencyIds = selectedFrequencyIds;
    }
}
  • 修改HTML复选框代码:
<input type="checkbox" th:each="freq : ${formfrequencylist}" 
       th:value="${freq.id}" 
       th:text="${freq.frequencyNm}"
       th:field="*{selectedFrequencyIds}" >

2. 调整Controller参数接收与处理逻辑

无需单独接收formFrequencylist,直接从regulatoryform中获取选中的ID列表,同时避免循环复用同一个实体实例:

@PreAuthorize("hasRole('ROLE_ADMIN')")
@PostMapping(value = "create/")
public String create(@ModelAttribute("regulatoryform") RegulatoryForm regulatoryform,
                     @ModelAttribute("acthasform") ActHasForm acthasform) {
    atiServiceImpl.saveRegulatoryForm(regulatoryform);
    acthasform.setFormId(regulatoryform);
    atiServiceImpl.saveActHasForm(acthasform);
    
    List<Long> selectedIds = regulatoryform.getSelectedFrequencyIds();
    if (selectedIds != null && !selectedIds.isEmpty()) {
        for (Long freqId : selectedIds) {
            // 每次循环创建新实例,避免数据覆盖
            FormHasFrequency formHasFrequency = new FormHasFrequency();
            formHasFrequency.setFormId(regulatoryform);
            // 根据ID查询对应的FormFrequency实体
            FormFrequency freq = atiServiceImpl.findFormFrequencyById(freqId);
            formHasFrequency.setFrequencyId(freq);
            atiServiceImpl.saveFormHasFrequency(formHasFrequency);
        }
    }
    return "redirect:/regulatoryform/";
}

3. 补充说明

  • 确保service层已实现findFormFrequencyById方法,用于根据ID查询FormFrequency实体。
  • 若不想修改RegulatoryForm,也可单独创建表单DTO类来承载复选框选中的ID列表。

内容的提问来源于stack exchange,提问作者Natasha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:54