处理表单提交传递给 Spring MVC 控制器方法的 "boolean" 参数的最聪明的方法是什么?

What is the smartest way to handle "boolean" parameter passed by a form submission into a Spring MVC controller method?

我正在开发一个 Spring MVC 应用程序,我对将布尔参数处理为 POST 请求[=55 的更聪明的方法有以下疑问=] 通过表单提交发送。

所以我有以下包含表单的简单 html 页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
     "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC - Hibernate File Upload to Database Demo</title>
</head>
<body>
    <div align="center">
        <h1>Spring MVC - Hibernate File Upload to Database Demo</h1>
        <form method="post" action="http://localhost:8080/AccomodationMedia/" enctype="multipart/form-data">
            <table border="0">
                <tr>
                    <td>Pick file #1:</td>
                    <td><input type="file" name="fileUpload" size="50" /></td>
                </tr>
                <tr>
                    <td>Pick file #2:</td>
                    <td><input type="file" name="fileUpload" size="50" /></td>
                </tr>
                <tr>
                    <td colspan="2" align="center"><input type="submit" value="Upload" /></td>
                </tr>

                <tr>
                    <input type="checkbox" name="isMaster" value="true">Is Master Image<br>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>

因此,如您所见,它包含一个名为 isMasterinput 字段,如果选中则发送字符串值 true(如果不勾选则此参数值为null)。

然后我有这个控制器class:

@RestController
@RequestMapping("/AccomodationMedia")
public class AccomodationMediaController {

    .....................................................................
    .....................................................................
    .....................................................................

    @RequestMapping(value = "/", method = RequestMethod.POST)
    public String handleFileUpload(HttpServletRequest request,
                                   @RequestParam MultipartFile[] fileUpload) throws Exception {
                                   //@RequestParam String isMaster) throws Exception {

        System.out.println("handleFileUpload() START");

        boolean isMaster;
        String isMasterString = request.getParameter("isMaster");

        if(isMasterString == null) {
            isMaster = false;
        }
        else {
            isMaster = true;
        }

        if (fileUpload != null && fileUpload.length > 0) {
            for (MultipartFile currentFile : fileUpload){

                System.out.println("Saving file: " + currentFile.getOriginalFilename());

                accomodationMediaService.saveAccomodationMedia(currentFile, isMaster);

            }
        }

        return "Success";
    }

}

所以有 handleFileUpload() 方法处理 POST 对 URI 的请求: http://localhost:8080/AccomodationMedia/

获取与isMaster参数相关的布尔值我做了:

String isMasterString = request.getParameter("isMaster");

在方法体中(所以我从 HttpServletRequest 请求 参数中检索它)。

我也试过用这种方式更改方法签名:

public String handleFileUpload(HttpServletRequest request,
                                   @RequestParam MultipartFile[] fileUpload,
                                   @RequestParam String isMaster) throws Exception {

只有勾选了html表单复选框才有效,否则isMaster参数为null则进入异常

所以我有以下疑惑:

1) 存在一种方法来指定(在 HTML 中)如果复选框未选中,则值必须为 false(避免使用 JavaScript).

2) 或者我可以将这种情况处理到控制器方法签名中吗?

3) 我可以将布尔值而不是字符串 1 传递给 HTML 形式吗?

1) Exist a way to specify (in the HTML) that if the checkbox is not check the value have to be false (avoiding to use JavaScript).

添加与false相同名称和值的隐藏输入:

<form action="/someaction" enctype="multipart/form-data">
    <input type="checkbox" name="isMaster"/>
    <input type="hidden" name="isMaster" value="false"/>
</form>

请注意,必须在 复选框之后指定隐藏输入。

2) Or can I handle this situation into the controller method signature?

是的,你可以。使用 defaultValue 属性 的 @RequestParam 注释:

@RequestMapping(value = "/", method = RequestMethod.POST)
public String handleFileUpload(
    @RequestParam(name = "isMaster", defaultValue = "false") Boolean isMaster,
    @RequestParam MultipartFile[] fileUpload){

    ...
}

在这种情况下,如果不选中复选框,isMaster 的值将是 false。而且您不需要将多余的隐藏输入添加到视图中。

3) Can I pass a boolean value instead a string one into the HTML form?

当然可以:

@RequestMapping(value = "/form", method = RequestMethod.GET)
public String showForm(ModelMap model){
    model.addAttribute("isMaster", true);
    return "someview";
}

然后在视图中,您可以使用传递的值来渲染复选框:

<form action="/someaction" method="post" enctype="multipart/form-data">
    <input type="checkbox" name="isMaster" ${isMaster?'checked':''}/>
    ...
</form>

通常,当数据从 UI 传递时,我喜欢处理字符串。

使用 Java 的 Boolean class 静态方法将 null 视为 false 比使用隐藏字段或额外注释更简单、更清晰且更易于维护。

Boolean.getBoolean(null) //Returns false 

"true"(不区分大小写)returns true,而其他所有内容 returns false.