使用 Spring MVC 控制器处理和验证 HTML 复选框

Posted

技术标签:

【中文标题】使用 Spring MVC 控制器处理和验证 HTML 复选框【英文标题】:Handling and validating HTML checkbox with Spring MVC controller 【发布时间】:2012-12-14 18:26:57 【问题描述】:

我正在使用 Spring MVC,我想要一个页面来注册我的用户。我想给他们接收电子邮件通知的选项,我有一些他们必须接受的服务条款,所以有两个复选框。我受到 html 复选框的限制,因为我还使用 thymeleaf 作为我的模板引擎。我想知道您将如何处理和验证复选框的值,无论它们是否被选中。当您使用复选框进行表单提交时,如果选中它们,则将值作为复选框的名称-值对传递给服务器,否则不传递任何内容。你有不同的处理方法,如下所示:

@RequestMapping(value = "/register, 
method = RequestMethod.POST, 
params = "notify", "agreed_tos")
public String register(/* other params like username/email */) 
    //register user


@RequestMapping(value = "/register, 
method = RequestMethod.POST)
public String registerMissingToS(/* other params like username/email */) 
    // return that agreed_tos checkbox wasn't checked

这样,如果复选框被选中,则调用第一个方法,如果未选中,则调用第二个方法。有没有办法检查是否选中了复选框,以便我可以在单个控制器方法中完成所有这些操作?你会怎么做呢?

【问题讨论】:

【参考方案1】:

您不必担心您的复选框在禁用时不会通过。 Spring MVC 为您完成了这项工作,Thymeleaf 为其提供了足够的基础设施。如果你的表单支持 bean(在 Spring MVC 术语中也称为 command)有一个布尔字段,你可以将它映射到一个复选框,不用担心。

每当在 Spring MVC 应用程序(无论是 JSP 还是 thymeleaf)中使用 input type="checkbox" 时,都会在其后面添加一个 input type="hidden",以便控制器层能够完美区分字段是禁用或未选中。

免责声明,根据 *** 规则:我是 thymeleaf 的作者。

【讨论】:

我不想在我的 Command 对象中使用布尔复选框,因为它只在控制器级别中需要(如果为 true,则注册帐户,否则通知用户他必须同意)。我可以有一个方法public String doRegistration(@RequestParam("checkbox_name") Object checkboxValue, /*Command Object*/ Account account); 并简单地检查checkboxValue == null 吗? Spring 会找到生成的隐藏输入吗?【参考方案2】:

解决方案 A:有点丑,但最快:从 RequestMapping 中删除参数,然后使用 request.getParameter("agreed_tos") 来检查这个参数。

解决方案 B:在表单中使用命令对象,因此如果用户将复选框留空并且 SpringMVC 将此输入绑定到命令对象字段,则 thymeleaf 或 spring 标签可以自动添加发送的隐藏输入

解决方案 C:@RequestParam 可能带有 defaultValue 和 required=false 允许在一种方法中完成这两种情况

【讨论】:

我正在考虑做 C,但你能扩展 B 吗?我还没有听说过使用命令对象。 检查文档:Thymeleaf + Spring 3 -> thymeleaf.org/documentation.html 上的第 6 章/本章中的示例很复杂,在您的情况下要简单得多/

以上是关于使用 Spring MVC 控制器处理和验证 HTML 复选框的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 3.0:如何有效地验证对所有请求映射都是全局的路径变量?

初学者对Spring MVC的认识

使用 Spring MVC 和 Knockout JS 进行服务器端验证

Spring-MVC:需要最简单的表单处理、绑定和验证示例

控制器或服务层中的 Spring MVC 验证?

带有注释的 Spring MVC 验证