我正在开发一个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表单吗?
答案 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
。