首页 > 解决方案 > 如何在 Thymeleaf/HTML 中使用带有 Java + Spring 的复选框?

问题描述

如何使用 Thymeleaf 从 html 中的复选框接收 true 或 false 到我的控制器,因此我可以将值设为 true 或 false 并保存在我的数据库中。到目前为止,我收到这些错误:

  1. org.thymeleaf.exceptions.TemplateInputException:
    模板解析时出错(模板:“类路径资源 [templates/normal/start-dag.html]”)
  2. 引起:org.attoparser.ParseException:
    执行处理器“org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor”时出错(模板:“normal/start-dag” - 第 24 行,第 44 列)
  3. 引起:org.thymeleaf.exceptions.TemplateProcessingException:
    执行处理器“org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor”时出错(模板:“normal/start-dag” - 第 24 行,第 44 列)
  4. 2018-07-17 09:05:16.097 错误 6713 --- [nio-8080-exec-2] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet] path [] 抛出异常 [请求处理失败;
    嵌套异常是 org.thymeleaf.exceptions.TemplateInputException: An error occurred during template parsing (template: "class path resource [templates/normal/start-dag.html]")] 根本原因
  5. java.lang.IllegalStateException:Bean 名称“goodNightOfSleep”的 BindingResult 和普通目标对象都不能用作请求属性
    在 org.springframework.web.servlet.support.BindStatus.(BindStatus.java:153) ~[spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    在 org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) ~[spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]

我的 html 看起来像这样:

<table>
    <tr>
        <input type="checkbox" th:path="goodNightOfSleep">
        <label th:for="${#ids.next('goodNightOfSleep')}" th:text="#{StartDay.goodNightOfSleep}">Kan du huske hvad du drømte?</label>
        <input type="checkbox" th:field="*{goodNightOfSleep}"/>
    </tr>
</table>

我的控制器:

// Start Day
@GetMapping("/normal/start-dag")
public  String opretGoal() {
    return "normal/start-dag";
}

@PostMapping("/normal/start-dag")
public String opretGoal(@ModelAttribute StartDay startDay, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "/normal/menu";
    }
    startDayService.createGoalOfTheDay(startDay);

    return "normal/menu";
}

我的 StartDay.java 类:

@Entity
@Table(name = "start_day")
public class StartDay {

    @Id
    @Column(name = "age_in_days", nullable = true)
    private int ageInDays;
    @Column(name = "day_created", nullable = true)
    private String dayCreated;
    @Column(name = "username", nullable = true)
    private String username;
    @Column(name = "dream_remembered", nullable = true)
    private boolean dreamRemembered;
    @Column(name = "nightmare", nullable = true)
    private boolean nightmare;
    @Column(name = "waking_time", nullable = true)
    private int wakingTime;
    @Column(name = "good_night_of_sleep", nullable = true)
    private boolean goodNightOfSleep;

任何帮助表示赞赏:)

更新#1

所以我只是试图从 html 中移动第二个 th:field,所以它看起来像这样:

<table>
    <tr>
        <input type="checkbox" th:path="goodNightOfSleep">
        <label th:for="${#ids.next('goodNightOfSleep')}" th:text="#{StartDay.goodNightOfSleep}">Kan du huske hvad du drømte?</label>
    </tr>
</table>

这使我实际上能够登陆页面,但我的复选框看起来像这样,并且不返回值:在此处输入图像描述

标签: javaspringspring-bootcheckboxthymeleaf

解决方案


控制器方法:

@GetMapping("/normal/start-dag")
public String opretGoal(Model model) {
    ...
    StartDay startDay = .... // e.g. new StartDay();
    model.addAttribute("startDay", startDay);
    ...
    return "normal/start-dag";
}

@PostMapping("/normal/start-dag")
public String opretGoal(@Valid StartDay startDay, BindingResult bindingResult, Model model)
{
    if (bindingResult.hasErrors()) {
        // log and/or handle errors
    }
    else {
        // your logic goes here
        startDayService.createGoalOfTheDay(startDay);
    }
    return "/normal/menu";
}

模板片段:

<form action="... or use th:action" method="post" th:object="${startDay}">
    ...
    <input type="checkbox" name="goodNightOfSleep">
    ...
</form>

您也可以将 th:field 用于 goodNightOfSleep-Input,但它的工作方式与上面所写的一样。Thymeleaf 按名称将字段与表单元素中定义的对象匹配。如果您选中该框,则该值将为真,否则将为假。

重点是 1.) 将对象添加到模型和 2.) 接收对象作为输入参数。

警告:代码在未经测试的情况下写入编辑器。可能有错别字。


推荐阅读