以前说好每天都要写一下博客,记录每天的学习日志和成长过程的,结果发现一直忙不过来,也经常忘记写。目前在做一个自己完全独立开发的ssm项目,前端肯定是网上找模板自己再改,改得头皮发麻。说句实话,后端的逻辑4层实体类model或po,dao数据层,controller控制层还有service层其实都很容易写,对于没有很复杂很难的功能而言。真就写逻辑写两个钟解决,改前端的页面改了整整一天。现在在即将全面开发功能阶段,页面改好了,登录那一块也是简单的做完了,开始做系统内部的功能。然后就开始遇到问题了。
说一下遇到的两个大问题,以后是走后端开发嘛,但是还没毕业,毕业设计又得是项目前后端独立完成,所以还得碰前端。巧了,问题就出在前端,我采用的不再是以前的jsp页面了(要是用jsp早写完了),采用html静态页面。为什么不用jsp,因为维护起来修改起来真的很麻烦,而且企业不是很拉的都是采用html了,不然一个是静态一个是动态,jsp一个请求整体刷一遍,html采用ajax的话是局部刷,对服务器压力也小。用jsp要考虑你有没有那么多钱去买服务器。然后很规范的说前端向后台的交互叫请求,后台向前端的交互叫响应。网上找解决问题的时候很多标题内容都不规范,什么后端请求前端的数据,前端响应后端的太多了。现在还差一步,系统内部的不说,做网页总有后端的数据给前端展示在页面上吧,不管是什么方式都是避免不了这种交互。采用的是html,提交的方式有很多种,比如a链接或者表单,ajax都可以提交请求。但接收后端的数据只能用ajax接收,在前端这一块一直出问题。
问题1:ajax的接收方式dataType:"text"可以拿到@ResponseBody的返回的值,当为dataType:"json"时一直走error方法
然后我去查,遇到问题不可怕,可以分析解决,怕的是第二个大问题(下面),出错了一直找不到问题,不知道错在哪里才是最可怕的。查的时候发现,json格式很严格,返回的不是json格式的就会走error错误方法,不会执行success里面的方法。再然后我细想,我也加了@ResponseBody注解了,为什么不行?现在来看,这个注解只是帮你把字符串对象转成JSON对象返回给前端。这里有得再剖析一波,我相信很多人和我一样,碰到过这问题。json其实是可以指一种格式,而SON是一个对象。要分清他们两个是不一样的,
使用@ResponseBody注解,它只是帮你把你要响应给前端的对象转成JSON对象,但格式是不会帮你转的,这是重点,我就是一直错在这里。
也就是说加了@ResponseBody注解之后响应回去的确实是一个JSON对象,但里面的格式不是json格式的。比如起初我直接用idea重写的toString()方法是这样子的。这样在controller返回对象的时候,不是json格式的JSON对象,所以ajax一直走error方法。这里的返回具体来说是一个字符串格式的JSON对象。
总结:响应前端的请求的时候,使用@ResponseBody注解仅仅是帮你转成JSON对象,但格式并不会帮你转成json的格式,所以要注意。
解决:我就没有导入什么奇怪的包,加JSON支持的包,因为问题并不在于转成JSON对象,而是格式的错误。所以我在网上找了toString生成json格式的形式。带个代码 public java.lang.String toString() {
final java.lang.StringBuilder sb = new java.lang.StringBuilder("{");
#set ($i = 0)
#foreach ($member in $members)#if ($i == 0)
sb.append("#####
#else
sb.append(",####
#end#if ($member.string || $member.date)
\"$member.name\":\"")
#else
\"$member.name\":")
#end#if ($member.primitiveArray || $member.objectArray)
.append(java.util.Arrays.toString($member.name));
#elseif ($member.string || $member.date)
.append($member.accessor).append('\"');
#else
.append($member.accessor);
#end#set ($i = $i + 1)
#end
sb.append('}');
return sb.toString();
}
之后生成的toString是这个样子的
打印一下
这样子返回的时候就可以走success了,因为你格式已经是json格式了,@ResponseBody还帮你转换成JSON对象了,都满足了就可以拿到了。注意自己的问题,是在格式出错还是在返回JSON对象出错,这才是解决问题的关键。我只是解决到了这里,弹窗出Object是因为这个是一个JSON对象,所以是Object对象类型,具体怎么拿里面的值,这个我还没解决,不过应该也容易了。
接下来是问题2:
我研究了一早上,直到现在,午饭都没吃还是不知道问题出现在哪?一开始碰到的时候去百度搜,许多人说删除cookie,相信我,没有用,不用删。试了许许多多的办法,还是这样,现在也没解决。然后我开始尝试去找问题,网上说是因为后台执行先于前端,有个地方肯定一直进行重定向,导致出现死循环。然后我第一个想到的是controller,我把整个controller给注释掉,还是没有成功!排除了这个,那我就开始怀疑是不是web.xml或者是springmvc配置的问题,一个一个注释掉,都没有成功。最后我没办法,(其实心态崩了,做了三周的项目,就差响应数据渲染在页面上这一步了,功能什么的都写差不多),复制粘贴了一份。好家伙,相同的东西一个能运一个一直是无限循环重定向。我还是忙着做快点赶上春招,所以没理,这里记录一下。因为是两个完全一样的,还是有炸掉的隐患,而且我不怕遇到问题,遇到了还可以分析解决。但这种连错在哪,问题在哪都找不到的,实在没办法,我一开始运了其他的项目,没问题,不是服务器的问题。也敢肯定不是浏览器的问题,唯一肯定的是项目本身的问题,直到复制一个相同的项目能运的时候,我自己也懵了。但没事,好在解决了一个问题,而且复制的那一份能运,这里记录一下。