SpringMVC 處理 Ajax 映射
以前,一直以為在 SpringMVC 環(huán)境中,@RequestBody 接收的是一個 Json 對象,一直在調(diào)試代碼都沒有成功,后來發(fā)現(xiàn),其實 @RequestBody 接收的是一個 Json 對象的字符串,而不是一個 Json 對象。然而在 ajax 請求往往傳的都是 Json 對象,后來發(fā)現(xiàn)用 JSON.stringify(data) 的方式就能將對象變成字符串。同時 ajax 請求的時候也要指定 dataType: “json”, contentType: “application/json” 這樣就可以輕易的將一個對象或者 List 傳到 Java 端,使用 @RequestBody 即可綁定對象或者 List。
SpringMVC 返回 Json 數(shù)據(jù)給前端是件很簡單的事,但是 SpringMVC 的 Controller 接收前端 Ajax傳來的 Json 數(shù)據(jù)卻不那么容易,前端和后端都要很小心,有一點不對就會出錯,需要分為 2 種情況處理:
- GET
- PUT, POST, DELETE
GET
一、瀏覽器端 Ajax 請求
- type 為 GET
- contentType 為 application/json
- data 是 JSON 對象,不能使用 JSON.stringify(data) 序列化
<script>
$(document).ready(function() {
$.ajax({
url: 'ajax-test',
type: 'GET',
dataType: 'json',
contentType: 'application/json',
data: {age: 10} //JSON.stringify({age: 10})
})
.done(function(result) {
console.log("success");
console.log(result);
})
.fail(function(error) {
console.log("error");
console.log(error);
});
});
</script>
二、服務(wù)器端
- method 為 RequestMethod.GET
- 使用 @RequestParam 接收參數(shù)
@RequestMapping(value="ajax-test", method= RequestMethod.GET)
@ResponseBody
public String ajaxTest(@RequestParam int age) {
System.out.println("==> age: " + age);
return "{\"success\": true}";
}
服務(wù)器返回的數(shù)據(jù)需要注意,例如 return "{success: true}" 或者 return success,返回的不是一個 JSON 對象的格式,瀏覽器端會調(diào)用 fail(),不過這時看 error 的 status 卻是 200。正確的 JSON 格式為 "{"success": true}",屬性名需要用雙引號括起來。
PUT, POST, DELETE
一、瀏覽器端 AJAX 請求
- type 為 PUT, POST 或 DELETE
- contentType 為 application/json
- data 不是 JSON 對象,需要使用 JSON.stringify(data) 序列化一下
<script>
$(document).ready(function() {
$.ajax({
url: 'ajax-test',
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({age: 10})
})
.done(function(result) {
console.log("success");
console.log(result);
})
.fail(function(error) {
console.log("error");
console.log(error);
});
});
</script>
二、服務(wù)器端
method 為 RequestMethod.PUT (POST, DELETE)
使用 @RequestBody 接收參數(shù)
如果只想取某一個參數(shù),可以使用 Map: @RequestBody Map map
把 Json 數(shù)據(jù)映射為一個 Java Bean: @RequestBody Topic topic
@RequestMapping(value="ajax-test", method= RequestMethod.POST)
@ResponseBody
public String ajaxGet(@RequestBody Map map) {
System.out.println("==> age: " + map);
return "{\"success\": true}";
}