处理表单提交传递给 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>
因此,如您所见,它包含一个名为 isMaster 的 input 字段,如果选中则发送字符串值 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
.
我正在开发一个 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>
因此,如您所见,它包含一个名为 isMaster 的 input 字段,如果选中则发送字符串值 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
.