记录SSH整合所遇到的坑
本文的内容持续更新
- 一号坑:struts2继承json-default会出错
- 二号坑:莫名其妙的找不到类
- 三号坑:spring和struts2整合
- 四号坑:没网启动失败,提示XML找不到文档
- 五号坑:ssh传输乱码
- 六号坑:Hibernate的select出错
- 七号坑:Java Date数据类型格式化换转化为json
一号坑:struts2继承json-default会出错
在struts.xml文件里我们要申明包package,然后可以extend一些东西,但是继承json-default的时候就出错了,关于struts2-json的jar包我也导入了,为什么就是报错呢,后来查了原因,发现是个很低级的原因,因为struts2要求所有的jar都要在web-inf的lib文件下,因为struts2要在运行时所得获得所有jar包,所以要加入到webcontent文件下。
二号坑:莫名其妙的找不到类
莫名其妙的找不到类,这个错误是最坑的错误,因为jar包的版本号不同,很多jar包都是配合使用的,如struts2的jar包和json的jar包配合使用,如果版本号不一致,可能启动项目的时候就会遇到找不到类情况,所以记住一点:jar包的版本要一定要配套,而且推荐使用Maven管理,我还不会Maven,一会写完博客去学学。
三号坑:spring和struts2整合
Spring会配置了,Struts2会配置,那么它们怎么才能整合在一起呢?首先,我们要在web.xml里配置一个监听器,然后把项目里用Spring的context的getBean方法全部都去掉,整合了以后struts2自己会监听Spring的Bean的创建,所以用不着这个了,我们直接在类上面加上注解,然后直接调用就行了,对了Action也可以加上注解哦,还是比较方便的。而且我们在struts2里面配置action的时候,可以直接把常常的class名称换成bean的名称,关于详细的整合教程,可以看这个博客。
四号坑:没网启动失败,提示XML找不到文档
这个问题呢,是由于没联网造成的,哈哈。我没联网的时候启动项目的,它报错:
然后我连上网以后就好了,很迷,这不是一个本地项目么,为啥要联网,我查了查,这个博客解释说因为Spring引的jar包的版本和xml文件里面声明的版本不一样造成的,项目在本地找不到,然后只能联网找。可是我改成了jar包的版本还是不行啊,这个问题待续。。。
五号坑:ssh传输乱码
后台数据库用的是UTF-8,eclipse编码用的是UTF-8,项目的字符集是UTF-8,JSP的字符集是UTF-8,加上过滤器设置请求和相应的字符集是UTF-8,为什么乱码。。。这个问题真的很头疼,至今我还也没有发现原因,但是我找到了很好的解决办法。
第一个解决办法(不推荐)就是把HttpServletRequest对象在传输的时候调用这个方法:
response.setCharacterEncoding("UTF-8");
response.getWriter().write(jsonResult);
这样再传输的时候就好了,但是我不推荐这个方法。原因有两个:第一,我在用ssh,所以servlet会显得比较原始;第二,用servlet传输数据要先转化为json字符串,然后再传输,为什么不直接用struts2里面自带的json-default呢,代码会简化很多。
第二种方法,不使用servlet,不转化json,直接使用struts2自带的json传输功能,把要传输的对象复制给一个Object对象,然后就可以了,剩下的都交给struts2的json传输机制帮你搞定,不仅解决了乱码问题,也使得Action部分的代码大大简化,下面是我的代码图片:
原来那么长的方法,现在只需要四行就好了,然后在struts.xml里面这么配置就好了:
六号坑:Hibernate的select出错
这是我Hibernate的基础没学好,下面是我的代码片段:
我拼写的hql语句要选择username, password, address, createTime和lastModifyTime这几个属性,并且返回一个拥有这几个属性的User,这就要求User类中有对应的这个属性的构造方法才行,这样Hibernate才能给你构造并返回。
七号坑:Java Date数据类型格式化换转化为json
如果一个有个日期类型的属性,Java对象的对应属性应该是Date类型的,如果把这个对象整个变成JSON传过去,会发现上网页上显示出来的时候是一个很大的数字,那该怎么转化呢?
最开始我想了一个办法是在创建一个对应的类,然后把Date对应的属性变成String属性,然后在传输前现在后台做好转换,这样前台一拿到就是一个格式化的字符串了,可是因为一个Date多了一个类。真是让人很不爽,后来发现直接用JackJson注解解决了:
加上注解以后,直接用jackson转化整个对象就好了。。。或者直接用struts2的json传输直接传输一个对象也可以哦