一、概念
-
@ResponseBody 作用在方法上,表示该方法的返回结果直接写入 HTTP 响应正文中,一般在异步获取数据时使用,即,AJAX请求。
通常在方法上使用 @RequestMapping注解后,方法执行完成后的返回值,通常解析为跳转路径,即,跳转到某个页面,比如登录成功后跳转到管理页面。但是如果此刻再在方法上加上 @ResponseBody注解后,方法返回的结果将不会再被解析为跳转路径,而是直接写入 HTTP响应正文中。 -
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 或者 json等格式】封装为对应的 JavaBean 对象,当然,也可以将其分别绑定到对应的字符串上,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
二、举例
1. @ResponseBody
前端ajax代码如下:
$.ajax({
type:"get",
url:"/spring/responseBody/getData.ajax",
dateType:"json",
success:function (data) {
$("#userName").val(data.userName);
$("#address").val(data.address);
}
});
后台代码如下:
@RequestMapping("/getData.ajax")
@ResponseBody
public User login(User user){
return user;
}
上述代码的效果等同于如下代码:
@RequestMapping("/getData.ajax")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
User字段如下:
public class User {
private String userName;
private String address;
……
// get/set方法
}
那么在前台接收到的数据为:'{"userName":"xxx","address":"xxx"}'
2. @RequestBody
前端代码如下:
$.ajax({
url:"/spring/requestBody/login.ajax",
type:"POST",
data:'{
"userName":"admin",
"password":"admin"
}',
content-type:"application/json charset=utf-8",
success:function(data){
alert("request success ! ");
}
});
注意:
@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,当传递对象时,可用 JSON.stringify(data)的方式就能将对象变成字符串,同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端,使用@RequestBody即可绑定对象或者List。
后台代码如下:
@requestMapping("/login.ajax")
public void login(@requestBody String userName,@requestBody String password){
User user = checkLogin(userName, password);
session.setAttribute("user", user);
return new JsonResult(user);
}
上面代码等同如下:
@RequestMapping("/login.ajax")
@ResponseBody
public Object login(@RequestBody User user, HttpSession session) {
user = checkLogin(user);
session.setAttribute("user", user);
return new JsonResult(user);
}
网友评论