And*_*ili 2 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>
Run Code Online (Sandbox Code Playgroud)
所以,正如你可以看到的那样,它包含一个名为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";
}
}
Run Code Online (Sandbox Code Playgroud)
所以有handleFileUpload()方法处理POST对 URI 的请求:http://localhost:8080/AccomodationMedia/
要获得与isMaster参数相关的布尔值,我已完成:
String isMasterString = request.getParameter("isMaster");
Run Code Online (Sandbox Code Playgroud)
在方法体中(所以我从HttpServletRequest 请求参数中检索它)。
我也尝试以这种方式更改方法签名:
public String handleFileUpload(HttpServletRequest request,
@RequestParam MultipartFile[] fileUpload,
@RequestParam String isMaster) throws Exception {
Run Code Online (Sandbox Code Playgroud)
它仅在 html 表单复选框被选中时才有效,否则isMaster参数为 null 并进入异常状态。
所以我有以下疑问:
1) 存在一种方法来指定(在 HTML 中)如果未选中复选框,则该值必须为false(避免使用 JavaScript)。
2)或者我可以将这种情况处理到控制器方法签名中吗?
3) 我可以将一个布尔值而不是一个字符串传递给 HTML 表单吗?
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>
Run Code Online (Sandbox Code Playgroud)
请注意,必须在复选框之后指定隐藏输入。
2)或者我可以将这种情况处理到控制器方法签名中吗?
是的你可以。使用注解defaultValue属性@RequestParam:
@RequestMapping(value = "/", method = RequestMethod.POST)
public String handleFileUpload(
@RequestParam(name = "isMaster", defaultValue = "false") Boolean isMaster,
@RequestParam MultipartFile[] fileUpload){
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果复选框,将不检查,值isMaster会false。而且您不需要在视图中添加多余的隐藏输入。
3) 我可以将一个布尔值而不是一个字符串传递给 HTML 表单吗?
当然可以:
@RequestMapping(value = "/form", method = RequestMethod.GET)
public String showForm(ModelMap model){
model.addAttribute("isMaster", true);
return "someview";
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中,您可以在下一个方式中使用传递值进行渲染复选框:
<form action="/someaction" method="post" enctype="multipart/form-data">
<input type="checkbox" name="isMaster" ${isMaster?'checked':''}/>
...
</form>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10117 次 |
| 最近记录: |