您的位置:首页 > 编程语言 > Java开发

spring @RequestBody @ResponseBody使用及原理

2016-09-09 15:05 525 查看

举例使用

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

参照文档:

http://www.huangyunkun.com/2014/10/30/spring-mvc-argument-resolver/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring
相关文章推荐