写一个近期小结吧,感觉自己动手写一个完整的项目确实能够锻炼自己的实践能力,虽然也是比较基础,但是基本上把学校学的知识技能都用上了,所以总结一下最近遇到的问题和解决办法,因为时间没有安排好,很早之前就想写了,结果越积越多,
1.重写toString()方法,因为java默认的是继承所有类的父类Object的tostring方法,该方法返回的是一个类名加哈希值代表的地址值,数组还会有多个【,但是平时可能会需要让该对象返回一些更有辨识度的信息,比如对象的属性值等等,这时候就要重写tostring方法了,比如写好的很多业务代码,接口要写好测试一下,在测试类里测试返回的信息是不是正确,就很有用了,做法就是在自己写的javabean类里重写一下tostring方法,做法也很简单,在idea里右键,点击generate-tostring,idea会自动帮你写好,也就是返回一个list,里面储存了Javabean对象的信息,比如
@Override public String toString() { return "Book{" + "id=" + id + ", name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", sales=" + sales + ", stock=" + stock + ", imgPath='" + imgPath + '\'' + '}'; }
2.网页中的crud中add操作和其他的是略有区别的,add操作会出现表单重复提交的问题,
表单重复提交:
当用户提交完请求,浏览器会记录下最后一次请求的全部信息。当用户按下功能键 F5,就会发起浏览器记录的最后一次请求。
之前写的时候发现了一个bug就是添加功能不能在servlet里用请求分发也就是dispatcher.forward这种,因为这样会出现重复提交,对于add来说重复提交就会一直添加一次又一次;应该使用页面重定向senddirect()这样就会解决问题.
3.在写dao包的sql语句注入时,一开始总是部署运行,但是数据库数据没有变化,后来一次次改,因为数据库版本等各种原因,所以sql语句的细节可能会略有不同,但是应该是都支持的,后来自己在workbench里crud然后用语句自动生成,发现里面用的单引号是tab键上的``而不是enter键旁边的’’,自怪自己当时大一jdbc学的不好吧,后来改正之后完美解决问题.
4.学会了使用idea的debug功能,这个真的是非常的有用,写一个完整的从前端到服务器三层到数据再返回的完整一遍流程中涉及的跳转,逻辑,调用特别的复杂(对于学生阶段的锻炼实践来说),所以出现问题很常见而且排错很抓狂,非代码问题的:浏览器兼容问题(写的页面样式在edge,ie上都没问题,但是谷歌的注册页面验证码的span和文本框对不齐,,),默认编码问题(中文一开始会显示乱码,后来上网解决了,在之前写的博客里有),网站缓存问题(更新了代码,重新部署发现没变化,清理缓存,解决),代码问题:用debugger就可以一步步查看锁定问题在哪,不用一点点改,一个一个试了,
5.a href是get方法,如果写的是post方法就在父类servlet的doget()里写成doPost(request,response);
6.写servlet的时候,尽量把操作同一类对象的功能写在一个servlet里,至于原因我想应该是,为以后着想,servlet更改了相应功能都要重新部署在服务器上,这样如果servlet写的太多譬如一个操作写一个,这样维护起来也非常麻烦,修改代码也一样,而且频繁部署肯定也会对服务器性能造成影响,所以就这样做,在网页里对不同操作附上action属性值,这样servlet接收时可以通过判断action属性值执行相应功能,而且刚开始自然想到的是用if,else判断action来执行不同功能,但是如果同一个对象的操作太多了呢?这样servlet写完会特别臃肿,代码量很大,出错率也会很大,所以有反射这么好的东西为什么不用呢?可以通过接收网页在request域中设置的action,然后获取相应的业务方法反射对象,这样就一劳永逸,代码就这几行就解决问题,写在一个父类BaseServlet里,完美解决后续问题
String action = req.getParameter("action");
try {
// 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class,
HttpServletResponse.class);
// System.out.println(method);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
6.先写这么多吧,希望以后能想到就立马写,要不然很多东西越积累越多就不好了,马上分页和用ajax和json优化一下效果,基本上就把学校学的东西都用上了,加油,马上就要开始看面经查漏补缺一下,还有ssm和springboot了,通过现在javaweb的再次实践稍微有点领悟一些框架的便利和优越性了,这种领悟是自然的,语言和编程确实是在不断优化和朝着简洁,逻辑清晰的方向在发展和进步的