1. 程式人生 > >spring @RequestBody @ResponseBody使用及原理

spring @RequestBody @ResponseBody使用及原理

舉例使用

@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).