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

时间:2017-01-03 11:50:22

标签: spring spring-mvc spring-annotations

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

所以我有以下简单的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>

所以,因为你可以看到它包含一个名为 isMaster 输入字段,如果选中,则发送字符串值 true (如果不是选中此参数值将为 null )。

然后我有这个控制器类:

@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()方法可以处理针对URI的 POST 请求: 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 参数为空并且会进入异常状态。

所以我有以下疑问:

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

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

3)我可以将一个布尔值而不是字符串1传递给HTML表单吗?

2 个答案:

答案 0 :(得分:4)

  

1)存在一种指定(在HTML中)如果没有复选框的方法   检查值必须为false(避免使用JavaScript)。

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

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

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

  

2)或者我可以将这种情况应用到控制器方法中   签名σ

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

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

    ...
}

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

  

3)我可以将一个布尔值而不是字符串1传递给HTML表单吗?

当然你可以:

@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>

答案 1 :(得分:0)

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

比使用隐藏字段或额外注释更简单,更简洁,更易于维护,只需使用Java的Boolean类静态方法将null视为false。

Boolean.getBoolean(null) //Returns false 

“true”(不区分大小写)返回true,而其他所有内容都返回false