@ResponseBody&@RequestBody
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
@ResponseBody该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。
由于json传递信息的方便性,用于传递json数据上的比较多。
使用@ResponseBody和@RequestBody需要引入两个包
jackson-core-asl,和 jackson-mapper-asl
附下载地址:/detail/czxt0605/7677923
可以在Controller中将json格式字符串转换成java对象、String。
以下为例:
@RequestMapping("/newDormInfo")
public @ResponseBody Info newDormInfo(@RequestBody Info info) throws Exception {
(Info);
}
- 如果在这个Controller某个方法中使用这两个注解的话,@RequestBody放在参数列表中你想要将json格式数据转化为相应Java对象的参数的前面;@ResponseBody则放在这个方法的前面。
@Controller
@ResponseBody
public class Login{
@RequestMapping("/userLogin") //设置结果编码,在response之后
public String userLogin(HttpServletRequest request,HttpServletResponse response) throws Exception{
}
- 如果在整个Controller中都想要返回数据为json格式的话,可以这样如上将@ResponseBody注解写在代码体之外
我遇到的一些问题
我们了解到,@ResponseBody可以将数据转化为json格式返回,而今天同学给我的接口的返回数据是jsonObj格式的,我就在想,既然String,java类对象都能转化为json格式输出,那这样的转化岂不是更方便?代码如下:
@RequestMapping("/newDormInfo")
public @ResponseBody JSONObject getDormInfo(HttpSession session) {
if (session.getAttribute("userid") == null) {
System.out.println(StudentUtil.get_dormitory_info(studentid,String.valueOf(new Date().getTime()),token));
return StudentUtil.get_dormitory_info(studentid,String.valueOf(new Date().getTime()),token);
}
return null;
}
- 返回数据类型设置的是JSONObject ,并且使用了@ResponseBody 注解,然而运行之后报错
Could not write JSON: Object is null (through reference chain: ["xb"]->["empty"]); nested exception is : Object is null (through reference chain: ["xb"]->["empty"])
//谷歌翻译过来就是
无法写入JSON:Object为null(通过引用链: [“xb”] - > [“empty”]); 嵌套异常是:Object为null(通过引用链: [“xb”] - > [“empty”])
- 在之前的代码中通过打印知道,首先我的数据并不是为空,那么这个问题出在嵌套异常上,在转化的过程中出错,也就是说,通过注解将JSONObject 的数据转化为json格式数据失败,或者说,无法转化。
于是我就换了一种返回数据类型,String,然而,又遇到了另一个问题,换成String格式之后,返回到前端的数据的确是json格式了,然而其中的中文全部变成了 问号?
有病乱投医,查了许多资料却不得要领,我在返回之前用几个方式将数据转化为了utf-8格式,然而到前端之后还是问号,好气哦。
静下来想一想,会不会不是我的问题,而是@RepsonseBody的问题,也就是说无论我在返回之前作何编码方式编码,它在返回的时候都会重新编码?依着这条思路找到了答案
这可以说是spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list则使用MappingJacksonHttpMessageConverter,返回string,则使用StringHttpMessageConverter,这个convert使用的是字符集是iso-8859-1,而且是final的。
引自:/hurryjiang/article/details/7710110
那,也就是说在返回之前,我们的数据被编码成了iso-8859-1的格式,前端编码格式不一致,导致乱码。
有很多解决办法,而一位博主的解决方法最是简单有效:
解决返回中文乱码的问题有两种,第一种是局部的,只针对于某个方法的返回进行处理,第二种是全局的,针对于整个项目,如下:
第一种:在@RequestMapping中添加produces=”text/html;charset=UTF-8,如:
@RequestMapping(value="/",method=,produces="text/html;charset=UTF-8")
@ResponseBody
public String login(@RequestParam(value="username") String userName,@RequestParam(value="password") String password){
return ("登录成功");
}
- 针对整个项目的中文乱码问题解决方法,请看原博主链接:/articles/zeeQfe