从四月初到五月十五,一直在忙一个JavaWeb项目。昨天交了主办方规定要交的文档和视频之后,比赛算是暂时告一段落了。身体累其实也不算什么,主要心很累。想写的冲动并不太强烈,只是觉得总该总结一下,过几天估计还得继续忙这个破事,到时候又没时间了,所以还是跑到图书馆带上耳机开始好好总结一下。技术上的,感悟上的都有。
当时决定参加这个浙江省服务外包大赛的时候其实是信心满满的,还一副有十足把握的样子鼓励队友要自信。结果刚起步不久就被一个SSH框架给卡死。技术不成熟是一方面的原因,毕竟这个学期才开WEB课,而且基本自学。但是程序员不就是讲究一个快速的自学能力吗,自己花了一个多星期,还不能搞懂该如何套着框架写代码,当时是各种自责和心急如焚。越急,越不能静下心来看书或者教学视频。不知道怎么把握团队的方向,只知道到图书馆一摞一摞的书借过来,这本翻一翻那本看一看,感觉都用不上,烦,急,崩溃。
幸好队伍里面另外一名队友找到突破口了,确定采用SSH2框架,并且能够教其他队友按照那个模式码代码。现在我会坦承是“幸好”,当时的我并不这么想呀。20岁的小伙子,平时就是争强好胜很多方面都不愿输给谁的一个人。当时感觉自己那么拼命的花了那么多时间和精力为什么我搞不出来,为什么。队友弄出来的时候我却想逃,想自己也马上去弄一个出来,至少把原理搞懂不要只按照他说的填代码。可是越这么想我发现自己越痛苦而且越弄不出来。那段时间经常给老姐打电话讲起这个比赛的事,讲起自己不是队伍的一把手怎么怎么不太开心。姐说她整个大学参加过的各种活动各种社团各种比赛中,她通常都是当二把手的,辅助队伍的核心。数学建模国赛美赛均是一等奖,创新立项两个,自己带的编辑部也是充当二把手,现在也保研到复旦金融系了。她还讲团队竞赛的意义不是要在队内竞争证明我比谁强,我偏不听谁的,我偏要当核心,而是要去证明我们这个团队比别的队伍强比别的队伍好比别的队伍更懂团结。这些道理平时要让我说我也会说,但是真的碰上问题了,我还是难改好斗的本性。但好在,我还是强按住了自己的本性,一脸歉意的找那个队友帮我讲解了一下SSH2的跳转映射流程,框架这个坎就算这样迈过去了,我也算调整好心态,当奶妈打辅助。
之后在一个留言板功能模块,涉及到写入数据库,但是写入之后发现乱码了。没什么经验,所以就百度,百度上主要提供的一个信息就是可能是MySql的统一编码方式没有设好,我用命令行检查了一下:
发现没问题啊,清一色UTF-8。后来又看到说MySql的编码方式要设置到数据表的字段一级。然后我就把留言那张表的字段一个个的检查了一遍,依然全部是utf-8.之后是各种坑爹的关于配置文件可能出错的说法,要去C盘找my.ini配置文件然后在里面再改编码方式,按照这个东西弄下去我终于成功的把MySql服务弄的不能开启了,OK。绝望的边缘以为要重装MySql了,不过好在胡乱的又把配置文件根据记忆给改了回来,MySql服务正常开启。也是从这里开始事情好像发生转机,我决定根据参数的传递路径来查一下到底是不是数据库编码乱码。没想到直接在Action中将JSP页面传过来的参数打印一下就出现乱码。尼玛问题范围瞬间缩小了。
System.out.println(Message.getReply());
打印出来是这样的:
于是又去百度,说这种从JSP传到Action中就乱码的问题可以通过写一个过滤器放在web.xml里面,我百度了一段代码放进去,重启Tomcat,依然不行。又在无意中发现,据说这是struts2-core-2.1.6.jar的一个bug,建议使用struts2-core-2.1.8.jar。尼玛我打开工程的Web App Library文件夹一看果然使用的是struts2-core-2.1.6.jar。正准备换2.1.8试试,又发现某位好心人说有一种简单的解决方式,就是对传过来的字符串先解码,再编码,最后再保存到数据库,代码如下:
1 Message msg=messageService.findByid(Message.getId()); //通过ID找到某条留言。 2 String s1=new String(Message.getReply().getBytes("ISO8859_1"), "UTF8");
//接收从jsp传过来的留言回复字段的值,按照ISO8859_1标准解码,再按照UTF-8标准重新编码,生成新的字符串s1.
3 msg.setReply(s1); //将msg的回复字段值设为s1. 4 messageService.update(msg); //更新msg。
按照他说的做了,真的成功了,好开心!
乱码的问题解决了,感觉心情好一点了,毕竟困扰了两三天。然后信心回来一点了,于是决定再静下心来把一直想解决的分页查看功能实现一下。还是以留言为例,要实现分页,可以在数据库中取的时候就分页,即为真分页。也可以把数据全部取出来,存在LIST对象中,在JSP页面控制显示,即为假分页。之前在很多诸如《javaweb典型模块与项目实战》等参考书中看到过分页功能的实现,可能是因为采用的框架不同,又或者是我心浮气躁,反正就是感觉用那些书上的代码套不到我们的项目中来,分页始终实现不出来。那天烦躁的不行,一怒之下甩开各种书啊视频什么的,自己写了一个假分页。原理很简单,但是算是自己的原创,不算抄代码,感觉倍儿爽。下面代码奉上:
1 <% 2 List<MessageView> list = (List) request.getAttribute("messagelist"); //取得Action中查出来存起来的留言LIST 3 int begin = 0; //begin代表该页从第几条留言开始显示,初始化为0 4 if (request.getParameter("begin") == null) { 5 begin = 0; 6 } else { 7 begin = Integer.parseInt(request.getParameter("begin")); 8 } 9 %> 10 <% for (int i = begin; i < (((begin + 4)<list.size())?(begin+4):list.size()); i++) { 11 %>//这里4代表每页显示的留言条数,可以自己设置。循环的判断中用到三目预算,主要是针对最后一页,如果最后一页数据少于4条然而依然使用和其他页一样的遍历方式就会报错空指针。 12 留言内容: <%=list.get(i).getContent()%> 13 ... 14 <%}%> 15 16 //下面的代码通过简单的逻辑判断来控制是否显示上一页和下一页的超链接,不做详细解释了,相信能看懂。
其中的超链接跳转的地址是本页面,但是传的参数begin会变化,页面也是根据取到的begin参数来决定从哪一条记录开始显示的。
17 <%if(begin>=4) {%> 18 <a href="messageQuery?begin=<%=begin -4%>">上一页</a> 19 <%} 20 if(begin<=(list.size()-4)){ %> 21 <a href="messageQuery?begin=<%=begin + 4%>">下一页</a> 22 <%} else{%> 23 已到最后一页 24 <%} %><br>
虽然很简陋,估计以后也不能用在正规的项目中,但只是想说有些问题如果参看别人的方法感觉搞不出来的话,自己尝试撸一下,说不定就撸出来了。
好,分页功能实现。转去实现一个订单功能。队友在建数据库的时候很专业的把订单表的表名取为Order,是吧,订单用英语翻译过去就是Order啊!可是尼玛就是这个破Order表坑了我三天,信心和耐心都几乎被磨灭殆尽。其实实现下订单的功能和其他功能一样呀,都是对一张表实现增删改查操作。但是每次一点确定预定,就报错,说
could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
刚开始百度说可能是字段名和MySql关键字冲突了,将信将疑的在这张Order表的所有字段名的前面全部加了"my_"前缀,再跑。还是could not execute query、could not execute insert;等等等等。烦死了,找另一个队友说,你来写一遍,不要看我的代码,看看是不是我哪个地方没注意,字段名尼玛都这样了怎么会冲突了,肯定是有其他原因。结果那妹子写了一遍,报了同样的错误,我不知道该说什么了。正当念着Order,Order我草你丫的时候,脑袋转过来了,Order!Order!!!尼玛自己经常用 Order by id desc 语句来实现对查询结果的倒序排列,这个时候没注意,肯定是Order与MySQL关键字冲突了。于是简单粗暴的把这张破Order表的表名改成了Dingdan. D-ing订,D-an单,多好记啊!多好用啊!马上各种query啊,insert啊,delete啊再也不报错了。三天的阴影解除,Fuck.
还有遇到过一些小问题,大多解决的比较快,这里就不多说了。初赛的作品要刻到光盘上,因为有个破缓存文件捣乱,昨天刻坏了7张盘才成功。队友一起写的60多页的文档用彩纸印刷出来真是高大上,尽管作品本身技术含量不算高,但是毕竟都尽力了。
第一篇半随笔半技术博客,希望自己以后能学到更多可以拿出来分享的东西。周末愉快。