bookStore图书商城,需求、设计、源码、问题、总结

这是简介


相信很多人在初学javaweb之后,对于所学的较为复杂多样的知识急需一个实战项目练手,于是我在网上找到了传智播客的一个经典小项目-----图书商城。它没有用到spring或者mybatis等框架,而是使用了诸如jsp,servlet等javaweb的核心,巩固基础再好不过了。

如果某些道友正在练习这个项目,并且碰到一些小问题的话,可以跳过项目介绍部分,直接看后面的问题部分


资源下载

开发的文档素材以及源码在这里:
https://download.csdn.net/download/stillonmyway/10310784
系统总是自动改积分,不让设置成0,真恶心


看看项目

  1. 这是一个简单的用例图,干着一些简单的事情。
    bookStore图书商城,需求、设计、源码、问题、总结_第1张图片
    虽说我们的项目很简单,但该有的前台后台的样子得有,后台负责添加,修改商品,删除商品。前台游客需要注册激活之后变成会员才能使用购物车,提交订单,支付等。

  1. 看下部分界面,直观感受一下。前端界面是项目自带素材,现阶段请大家忽略画面。。。
    bookStore图书商城,需求、设计、源码、问题、总结_第2张图片bookStore图书商城,需求、设计、源码、问题、总结_第3张图片bookStore图书商城,需求、设计、源码、问题、总结_第4张图片bookStore图书商城,需求、设计、源码、问题、总结_第5张图片bookStore图书商城,需求、设计、源码、问题、总结_第6张图片bookStore图书商城,需求、设计、源码、问题、总结_第7张图片bookStore图书商城,需求、设计、源码、问题、总结_第8张图片bookStore图书商城,需求、设计、源码、问题、总结_第9张图片

聊聊项目

首先热烈欢迎饱受界面摧残的兄弟成功抵达了这里(众人:傻逼,快开始)

  1. 你需要一个装有mysql5.x、tomact7.x、 eclipse(这个随意)的电脑

  2. 作为一个web项目,分层思想一定得有。dao,service,web三个包是必须滴,外加entity实体包,utils工具包,自定义的exception包之类的,我觉得这都能体现开发的思想,脑子里面得有这些概念

  3. 使用到的技术和jar包: jdk1.7,javaBean,jsp,servlet,filter,javaMail,jdbc,c3p0,commons-dbutils(jdbc的简单封装),commons-fileupload(文件上传组件),commons-beanutils(请求参数的封装)

  4. 根据文档的流程图,时序图等来完成各个模块

所遇问题和经验总结

  1. edit.jsp中设置的 后台servlet中的req.getParameter(“id”) 无法取到值,怀疑跟form标签中的enctype属性有关 因为要上传图片,所以表单变成了enctype=“multipart/form-data”
    解决:暂时是通过session来解决的

  2. id属性和 onclick事件同一个名字会导致javascript失效

  3. Get方式提交参数中文乱码问题:通过前端URIencoder和后端URIdecoder解决

  4. 购物车的设计Map包含商品和购买数量,product需要重写hashcode和equals方法,不然无法判断车里面的商品是否为同一种

  5. 模糊查询的sql拼写 like %xxx%

  6. El表达式empty和三元运算符的结合使用 ${empty product.category ? “全部商品” : product.category} 如果没有选择商品类型,就显示全部商品

  7. El 表达式循环map集合
    比如这样取商品价格:${entry.key.price }

  8. 用for循环删除购物车中的商品,报错concurrentModificationException。因为for循环遍历集合时候,不允许直接对集合本身做操作,可以使用迭代器来操作增删改。(javaSE基础)

  9. 代码优化:学会抓住主要矛盾,核心变量,减少多余的代码。
    bookStore图书商城,需求、设计、源码、问题、总结_第10张图片bookStore图书商城,需求、设计、源码、问题、总结_第11张图片

  10. 代码优化:理解原理,转换思路。如果理解了map集合的存取原理,就没必要细化到内部去利用循环的方式。(给我的感觉第二种相当于数学上的简便计算)
    bookStore图书商城,需求、设计、源码、问题、总结_第12张图片bookStore图书商城,需求、设计、源码、问题、总结_第13张图片

  11. 生成订单的时候需要操作三张表,要放在同一个事务当中,用了threadlocal 和 动态代理来简单实现 AOP的思想,用代理类来代理业务的实现,让业务层只关注业务逻辑。

  12. El表达式,一定要记得${}取值,底层实现原理是pageContext.findAttribute()和调用javaBean的getter方法,所以变量名要和getter方法一致

  13. 在对ResultSet 结果集进行操作的时候,当查询出来结果的只有一笔数据时,我想当然的认为不需要调用next()方法,直接进行getString() 或者 getInt() 进行数据的读取,结果报错。
    **原因:**是ResultSet对象维护了指向当前数据行的光标,每调用一次next(),光标就会移动一行。然而光标最初的位置是在第一行之前,所以至少需要调用一次next()方法,将光标移动到第一行。

  14. 删除订单表数据的时候,要先删除相关联的订单详情表数据,因为有主外键约束,需要先删外键,再删除主键。涉及多个表的增删改时候,要保证事务的统一。可以用代理模式来实现AOP的编程思想。把事务控制剥离出来,专注业务代码

  15. 权限控制问题,比如非管理员不可以访问后台资源,需要创建过滤器,并在web.xml中配置好,别忘记要放行chain.doFilter(req,resp)。如果用到重定向之类的跳转,别忘了加return,不然下面的语句还是会执行。拦截器还可以针对某个servlet来拦截,配置即可

  16. 完成自动登录的时候,循环取出cookie要加上一个判断条件,for (int i = 0; cookies != null && i < cookies.length; i++),因为cookies可能是为空的。另外,用户退出的时候也需要销毁自动登录的cookie,不然随便点击又自动登录进去了。销毁cookie不是只setMaxAge(0)就可以了,还需要setPath(),最好还加上setDomain()。因为cookie不是由名称来决定唯一性的,还需要带上路径。cookie带去浏览器的只有key和value,其他的path,domain都需要重新设定。
    在此附上别人一篇博客,与我碰到了相同的问题:http://duqiangcise.iteye.com/blog/1855325

  17. 将关于user的几个servlet合并成一个UserServlet,然后继承BaseServlet,用反射来完成servlet里面各个方法的调用。问题是在web.xml 中配置的时候,为什么只配置UserServlet就可以,而不需要配置BaseServlet?
    **原因:**想明白了,因为根据配置的路径,tomcat容器会找到相应的servlet,创建并执行它的init,service,destroy等方法,既然创建了UserServlet,那么必然会创建它的父类BaseServlet这个类,然后执行里面的service()

  18. 利用反射简化servlet时候,所有和user相关的操作都放在/user路径下,再通过get方式传参决定执行哪一个方法。比如想要登录,把LoginServlet简化成UserServlet中的login方法,请求地址写成:/user?method=login,后台拿到参数login,然后反射调用login()方法。但是有一个问题,此时不能再执行相同的url-pattern(即使后面的参数是不同的),这样会导致无限循环,/user?method=myAccount
    **解决:**一开始固化的思维限制了我,我使用了sendRedirect()方法,但这样会丢失request里面保存的数据。后来想通了,直接在login方法里面调用myAccount不就好了嘛,把request和response传过去,login没做完的任务交给myAccount搞定,多简单。被自己的愚蠢打败。

  19. 在eclipse中重启项目,tomcat会重新编译部署,这会导致上传到webapps目录下的文件丢失
    **解决:**应当指定tomcat目录之外的某个目录来存放上传的文件。

  20. HttpServlet类中的service方法,针对各种请求的不同处理方式,就是模板设计模式


这里还有一个未解决的小问题,我用chrome和safari打开的时候,index.jsp中首页图片显示不出来,查询数据时,连接池启动特别慢?而用safari就没有这种问题,或许是浏览器的兼容性问题?

如果哪位道友也出现了这个问题,可以讨论一下


结束语

差不多就是这个样子,希望我遇到的问题可以帮助到大家,因为看过这个项目的人还挺多,欢迎交流,道友们共同进步!

你可能感兴趣的:(JAVA初学,实战项目,javaweb)