前面我们对序列化(https://blog.nowcoder.net/n/f813847f62374aac99738eebc7ef6d03)进行学习的时候,谈到了对象在网络传输时必须实现序列化,
而spring的@ResponseBody可以直接返回数据给ajax,所以我对@ResponseBody进行了初步的研究记录:

作用【一般是结合ajax一起使用,返回结果会传到ajax结果中】

        作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端

        当方法上面没有写ResponseBody,及不需要用到response响应的body来传数据的时候,则可参考前面写过的转跳页面文章:https://blog.nowcoder.net/n/8d1a7de98a084e4e8f391d772b056e05

        如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json格式的字符串,然后写到客户端。

       注:ajax的datatype属性如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。所以ajax可以自动解析后端传过来的普通字符串或者json格式的字符串,所以不用去操心它。


注意编码

        如果返回对象,按utf-8编码。如果返回String,默认按iso8859-1编码,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,
        例如@RequestMapping(value="/cat/query",produces="text/html;charset=utf-8"),前面是请求的路径,后面是编码格式。
        注:当我们在开发中用结果类把返回结果包装起来的时候就都是按utf-8了

原理

        控制层方法的返回值是如何转化为json格式的字符串的?其实是通过HttpMessageConverter中的方法实现的,它本是一个接口,在其实现类完成转换。如果是bean对象,会调用对象的getXXX()方法获取属性值并且以键值对的形式进行封装,进而转化为json串。如果是map集合,采用get(key)方式获取value值,然后进行封装。
具体底层找不到太多解析,不过由于用原生spring的@ResponseBody时需要导入Jackson的包,所以底层应该使用到了Jackson。





由于@ResponseBody返回对象时是包装成JSON格式的,所以也来了解下JSON格式的各种工具类:

FastJSON:阿里巴巴开发的

Jackson:springboot已集成,可直接用

工具包org.json.jar:

        是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookies,  CDL的转换。
        org包:由企业或者组织提供的java类库。集成到jdk中但大部分不是sun公司的,可以直接使用。其中比较常用的是w3c提供的对XML、网页、服务器的类和接口。