Thymeleaf + Spring MVC中的绑定复选框
Posted
技术标签:
【中文标题】Thymeleaf + Spring MVC中的绑定复选框【英文标题】:Binding checkbox in Thymeleaf + Spring MVC 【发布时间】:2016-05-27 16:59:53 【问题描述】:我的 Spring MVC 应用基于 Spring boot 1.2.8、Thymeleaf、Hibernate 和 Hateos。我有一个实体“市场”,其中包含布尔类型的“启用”字段。
@Entity
@Table(name = "market")
public class Market
.....
private Boolean enabled;
....
public Boolean getEnabled()
return enabled;
public void setEnabled(Boolean enabled)
this.enabled = enabled;
“/create”控制器中的代码
@RequestMapping(value = "/create", method = RequestMethod.GET)
public ModelAndView create()
return new ModelAndView("market/create")
.addObject("list", linkTo(methodOn(MarketController.class).list())
.withRel("List"))
.addObject("market", new Market())
.addObject("postLink",
linkTo(methodOn(MarketController.class).save(null, null, null, null))
.withRel("Save"));
模板“市场/创建”,参考。 http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#checkbox-fields
<form th:action="$postLink.href" th:object="$market" method="post">
....
<div class="form-group">
<label th:for="$#ids.next('enabled')" th:text="#market.enabled">Enabled</label>
<input type="checkbox" th:field="*enabled" />
</div>
....
</form>
在浏览器中打开 /markets/create 时,勾选复选框出现以下异常
Cause: org.thymeleaf.exceptions.TemplateProcessingException Attribute "value" is required in "input(checkbox)" tags when binding to non-boolean values
为什么 Thymeleaf 将“启用”字段视为非布尔类型?我已尽我所能找出原因,但徒劳无功。请给出一些提示来解决它。谢谢。
【问题讨论】:
【参考方案1】:控制器
@Controller
public class BaseController
@GetMapping("/")
private String index(DemoDto demoDto)
return "index";
@PostMapping("/")
private String receiveValues(DemoDto demoDto)
System.out.println(demoDto);
return "index";
DTO
public class DemoDto
private String name;
private boolean global;
//getter setter for name
public boolean isGlobal()
return global;
public void setGlobal(boolean global)
this.global = global;
//toString()
HTML
<body>
<form th:action="@/" th:method="post" th:object="$demoDto">
<label>Enter Name:</label>
<input type="text" th:field="*name" name="name">
<br/>
<label>Global</label>
<input type="checkbox" th:field="$demoDto.global"/>
<input type="submit" value="Submit">
</form>
</body>
这里最重要的是你如何定义th:field="$demoDto.global"
。 $
和对象名称 demoDto
都是必需的。
会生成html代码。
<body>
<form action="/" method="post">
<label>Enter Name:</label>
<input type="text" name="name" id="name" value="">
<br/>
<label>Global</label>
<input type="checkbox" id="global1" name="global" value="true"/>
<input type="hidden" name="_global" value="on"/>
<input type="submit" value="Submit">
</form>
</body>
从 ui 提交时收到:
DemoDto [name=Dev, global=true]
【讨论】:
非常感谢!我最终找到了如何使用复选框实现表单的简单易懂的示例。请问您可以添加带有多个复选框的示例吗?【参考方案2】:无论如何,属性value
是必需的。
试试这样的:<input type="checkbox" th:field="*enabled" value="true" />
。检查输入时,enabled
字段应由true
设置; null
otherwise。
【讨论】:
感谢大卫,我之前尝试过使用“值”,但保存在 DB 中时它会被忽略。据我了解,没有必要在表单中添加“价值”,由春豆支持,由百里香完成。如果我错了,请纠正我。例子。 github.com/thymeleaf/thymeleafexamples-stsm/blob/2.1-master/src/…,寻找 你是对的,对不起,我弄错了,如果你删除value
属性,属性enabled
应该被初始化。
是的,也试过了。在实体类中设置了“private Boolean enabled = Boolean.FALSE”,但 thymeleaf 并未将其视为“布尔值”并继续抛出异常。我正在查看示例github.com/thymeleaf/thymeleafexamples-stsm/blob/2.1-master/src/…,它有一个布尔类型的“覆盖”字段。
在生成的 HTML 中是否有 value
属性且具有非空值?根据源码可知,post过程中value为null时会触发该异常。【参考方案3】:
尝试将您的属性命名为“启用”以外的其他名称,也许是“市场启用”。
【讨论】:
以上是关于Thymeleaf + Spring MVC中的绑定复选框的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC:如何在 Thymeleaf 中获取当前 url
Spring MVC + Thymeleaf:将变量添加到所有模板的上下文中
Thymeleaf (Java Spring):无法让 mvc.uri 工作