深夜写一波笔记,以感谢自己又解除了一大疑惑
现在是2021年3月13日晚十一点十五分,,,,爸爸妈妈都睡着了。。。
上学期的时候呢,我怀着对SSM的憧憬,在啃完SSM的课程后,在没有任何练手项目的经验下,写了一个选课系统,大家可以看我博客,有视频的,寒假因为种种因素,我又需要SSM,但是自己心里也知道,自己学的不扎实,那个选课系统,基本上就是搬砖2个月,,,,
其中,给我印象特别深刻的bug都是json,那真的是捣鼓了好几天,最终我也不知道咋的了居然草草收场了,,今晚,在目前的前半个小时,我本打算冲澡睡觉,但又想还是对今天学的东西终结一下吧,巧的是我有了意外收获。
正文,首先请看下面一小段jquery代码
var user = {username: "张三",password: "456789"};$.ajax({url: "/login",type: "POST",data: user,success: function (data) {if (data.code) {window.location.replace("home.html");} else {alert(data.msg);}}});
var user = {username: "张三",password: "456789"};$.ajax({url: "/login",type: "POST",data: user,contentType: "application/json;charset=utf-8",success: function (data) {if (data.code) {window.location.replace("home.html");} else {alert(data.msg);}}});
我疑惑的问我自己:上面content-type是默认的时候看起来还像个json数据,下面我把content-type设置为了json格式了怎么越不像json字符串了。。。
因为data属性存放的是对象,而不是字符串,
下面,通过js自带的json转化工具将对象转化为字符串重新测试一下,
var user = {username: "张三",password: "456789"};var str = JSON.stringify(user);$.ajax({url: "/login",type: "POST",data: str,success: function (data) {if (data.code) {window.location.replace("home.html");} else {alert(data.msg);}}});
我高兴的对我说,兄弟们,这指定是个json数据了,但是后面咋多了个:,对,就是这个:卡我好几天。。。
将content-type改为json后,是这样,,,,
这才是真正的json数据啊,
上面的json惨案结束,总结一下,若前端要发送json数据给后端,则首先需要设置content-type为json类型,其次。要保证data里面的数据是json字符串而不是对象。
下面再来聊聊RequestBody与ResponseBody注解
ResponseBody简单,我们知道,SpringMVC若返回String类型的字符,默认是走视图解析器的,如果不想走视图解析器,直接返回数据给浏览器,则可以使用RequestBody注解,将任何对象转化为json字符串,写回给浏览器,前提是需要存在json转化器(jckjson或fastjson),fastjson需要配置
RequestBody就更好完了,首先我们得知道一点,SpringMVC的方法是可以自动封装bean对象的,即若请求参数的方法名与bean对象的属性名相同,则进行封装,就是上面的第一种情况,
data中传入的是对象,content-type使用的是默认的,这种情况下是可以自动封装的,不需要依赖任何json转换工具,,
但是,如果你使用的是上面最后一种的方式,
这种情况下,数据是封装不上的,
这时可以使用RequestBody注解来对这些数据进行解析,封装称为bean对象,但是需要注意,这种情况下需要json转换器。。。
完毕完毕,终于写完了,以后终于可以随便用JSON了,终于可以随便用@RequestBody与@ResponseBody了,
其实,写这个博客源于Shiro的学习,那东西有点难搞,,睡觉睡觉。。。
发布评论