spring @RequestBody @ResponseBody使用及原理
阿新 • • 發佈:2019-01-01
舉例使用
@RequestBody是把整個HttpServletRequest的輸入(request.getInputStream()),轉換成一個物件,常用的轉換是採用json方式,在spring中是RequestResponseBodyMethodProcessor利用HttpMessageConventer做的。
前端程式碼必須採用POST請求(GET請求的輸入是空):
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var saveDataAry=[];
var data1={"userName":"test","address":"gz"};
var data2={"userName":"ququ","address":"gr"};
saveDataAry.push(data1);
saveDataAry.push(data2);
$.ajax({
type:"POST" ,
url:"http://localhost:8080/test/mvc/saveUser",
dataType:"json",
contentType:"application/json",
data:JSON.stringify(saveDataAry),
success:function(data){
alert("succes" +data);
},
error:function (argument) {
alert("error" + argument);
}
});
});
</script>
</head>
<body>
test
</body>
</html>
後端程式碼
@Controller
public class UserController {
@RequestMapping(value = "saveUser")
@ResponseBody
public String saveUser(@RequestBody List<User> users) {
System.out.println("UserController.saveUser users size:"+users.size());
return "ok";
}
}
整體springmvc 呼叫鏈路
@RequestBody
在處理引數時候各種HandlerMethodArgumentResolver來解決引數實際需要傳遞引數,其中預設的有24中;而處理@RequestBody的是RequestResponseBodyMethodProcessor。相對的,處理@CookieValue註釋的則是ServletCookieValueMethodArgumentResolver。
@ResponseBody
而responseBody同樣是RequestResponseBodyMethodProcessor作為HandlerMethodReturnValueHandler,處理實際執行的controller HandlerMethod函式的return value.
public void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
throws IOException, HttpMediaTypeNotAcceptableException {
mavContainer.setRequestHandled(true); //最重要一步,設定請求已經處理過
if (returnValue != null) {
writeWithMessageConverters(returnValue, returnType, webRequest);
}
}
RequestResponseBodyMethodProcessor 的handleReturnValue()函式處理時,首先ModelAndViewContainer.requestHandled設定成功,表明整個http請求已經處理,後續就不會執行veiw渲染了(跳過render view).