java - 如何在 Thymeleaf/HTML 中使用带有 Java + Spring 的复选框?
问题描述
如何使用 Thymeleaf 从 html 中的复选框接收 true 或 false 到我的控制器,因此我可以将值设为 true 或 false 并保存在我的数据库中。到目前为止,我收到这些错误:
org.thymeleaf.exceptions.TemplateInputException: 模板解析时出错(模板:“类路径资源 [templates/normal/start-dag.html]”)
引起:org.attoparser.ParseException: 执行处理器“org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor”时出错(模板:“normal/start-dag” - 第 24 行,第 44 列)
引起:org.thymeleaf.exceptions.TemplateProcessingException: 执行处理器“org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor”时出错(模板:“normal/start-dag” - 第 24 行,第 44 列)
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]")] 根本原因
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>
解决方案
控制器方法:
@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.) 接收对象作为输入参数。
警告:代码在未经测试的情况下写入编辑器。可能有错别字。
推荐阅读
- javascript - 我在谷歌表格“TypeError:无法读取未定义的searchRecord @ Code.gs:213的属性'0'”上不断收到此错误
- swift - 导入 Swift 包时,Xcode 链接器可以删除未使用的代码吗?
- python - Python discord bot屏幕录制功能不会停止录制
- shell - 如何仅从文件的创建/修改日期中提取日期?
- asp.net-web-api - 根据响应状态代码 Audit.Net 过滤请求
- c# - 如何使用轮询 LoadBalancing 访问 GRPC 服务器以在 AKS 中长时间运行进程?
- reactjs - 运行反应本机应用程序时显示错误
- performance - SpaCy NER 模型的实体级别的 PRF 值
- xml - 获取传入 XML 中元素的所有值
- reactjs - 尝试连接时的django csrf身份验证错误反应