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

这是简介


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

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


资源下载

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


看看项目

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

  1. 看下部分界面,直观感受一下。前端界面是项目自带素材,现阶段请大家忽略画面。。。
    这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述

聊聊项目

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

  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中设置的<input type=“hidden” name=“id” value=“${product.id}”> 后台servlet中的req.getParameter(“id”) 无法取到值,怀疑跟form标签中的enctype属性有关 因为要上传图片,所以表单变成了enctype=“multipart/form-data”
    解决:暂时是通过session来解决的

  2. <input type=“checkbox” id=“selAll” onclick=“selAll”> id属性和 onclick事件同一个名字会导致javascript失效

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

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

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

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

  7. El 表达式循环map集合 <c:forEach items=“${cart}” var=“entry” varStatus=“vs”>
    比如这样取商品价格:${entry.key.price }

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

  9. 代码优化:学会抓住主要矛盾,核心变量,减少多余的代码。
    这里写图片描述这里写图片描述

  10. 代码优化:理解原理,转换思路。如果理解了map集合的存取原理,就没必要细化到内部去利用循环的方式。(给我的感觉第二种相当于数学上的简便计算)
    这里写图片描述这里写图片描述

  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来拦截,配置<servlet-name>即可

  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就没有这种问题,或许是浏览器的兼容性问题?

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


结束语

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

  • 11
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值