本文涉及少许的HttpMessageConverter知识,可以看之前的Spring类型转换。
本文的内容及JSON的内容。
1 @ResponseBody注解解释
@Responsebody 注解在控制器中的映射方法上,如
@RequestMapping(value = "user/login")
@ResponseBody //不加这个注解会使用视图解析器,所以必须加
// 将ajax(datas)发出的请求写入 User 对象中,返回json对象响应回去
public User login(User user) {
User user = new User();
user.setUserid(1);
user.setUsername("MrF");
user.setStatus("1");
return user ;//返回一个java类对象,ResponseBody会转换成json
}
作用:
@Responsebody 注解表示该【方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中】,加上这个注解后我们就不走视图解析器了,而是处理完后直接将对象写入HTTP 响应正文中(response的body数据区),写入的这个对象不是java对象,而是通过HttpMessageConverter转换后的如json对象,但能表达java对象的含义。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;如我们要获取一些json,因为json可以用再我们的js页面中,而java对象再js中不能用它。如下使用ajax异步发送了请求,获得了一些json
function login() {
var datas = '{"username":"' + $('#username').val() + '","userid":"' + $('#userid').val() + '","status":"' + $('#status').val() + '"}';
$.ajax({
type : 'POST',
contentType : 'application/json',
url : "${pageContext.request.contextPath}/user/login",//要访问服务器端的login
processData : false,
dataType : 'json',
data : datas,
success : function(data) {
alert("userid: " + data.userid + "username: " + data.username + "status: "+ data.status);
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
alert("出现异常,异常信息:"+textStatus,"error");
}
});
};
异步获取 json 数据,加上 @Responsebody 注解后,就会直接返回 json 数据。
需要的jar 包:
下载地址 http://wiki.fasterxml.com/JacksonDownload/
jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar
响应头:
Content-Type:text/html;charset=UTF-8
Content-Type:application/json;charset=UTF-8
2 @RequestBody注解解释
上面的@ResponseBody注解我们是把java转成了json,而@RequestBody 是将js页面传来的json转换成java对象,传入到方法形参中,json转成java对象也使用了HttpMessageConverter。json来自HTTP 请求body正文
使用时机:
A) GET、POST方式提时, 根据request的 header的 Content-Type的值来判断:
- application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
- multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
- 其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B) PUT方式提交时, 根据request header Content-Type的值来判断:
- application/x-www-form-urlencoded, 必须;
- multipart/form-data, 不能处理;
- 其他格式, 必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;
例如:
@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入 User 对象中
public User login(@RequestBody User user) {
// 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
return user;
}