今天在写代码的问题:
前台通过ajax和后台的SSM框架进行交互,进行测试时发现,后台已经正常进入controller,并且正常进入对应的方法,也正确的返回了对应的数据,但是,前台ajax总是会进入到error的function里面。
还是老办法,一步一步解决问题。
定位问题:既然每次都进error的function里,那我们就吧error的function的参数打印出来,ajax的error function的参数有三个,分别为:error:function(jqXHR,textStatus,errorThrown)
上面为这三个参数的具体含义。
知道这些参数的含义,那么我们就可以在进入error:function的时候把它们在控制台console.log()出来,这里我只打印出来以下4项:
console.log(jqXHR.status);
console.log(jqXHR.readyState);
console.log(jqXHR.responseText);
console.log(jqXHR.statusText);
然后自己又进行了一次测试,这次可以在控制台看到readyState---4,正常,status--200,正常,但是resposeText提示下面这个异常,unexpected token in json at postion 4,后面紧接着一句,parse error。
看这句话意思是后台数据返回前台时json解析出现错误了,去网上找了很多解决方案,大家都是dataType写错了才导致这个异常,可是自己的dataType:“json”没错,这怎么回事?
想了很久,忽然想到,可能action里的方法上没有加@ResponseBody这个注解,一去检查,果然,问题找到了,加上注解就可以正常返回了。
总结:平时responsebody注解没少用,可是自己没有想过他是干嘛用的,其实他就是一个将你返回的数据以json形式返回给前台,当然这里返回的类型不仅仅是String,还有List,map,VO,等等。
但是当我们方法返回的是modelandview时,是不需要这个注解的
最后,感谢这位博主的分享。
2019-3-4更新:
今天在调用ajax时候出现了一些问题,声明了三个全局变量,然后将ajax的结果赋值给这三个全局变量,最后将这三个全局变量当作一个数组中的元素的值,如下图:
这里的问题是我最终打印数组元素的值,发现本该有值的全局变量为undefined,我在ajax中success:function()明明已经赋值了,为什么还没有呢?原因是,一开始我没有加async属性,它是默认为true的,所以它不会等URL请求完毕,他会直接进入下一步,所以就造成了这种情况,以前遇到过,但是忘记做记录了,特此记录下。