tags: JavaWeb小项目


感想

该项目是目前为止,我写过代码量最多的项目了.....虽然清楚是没有含金量的【跟着视频来写的】,但感觉自己也在进步中.....

写的过程中,出了不少的问题.....非常多的Servlet,JSP看得眼花.....

现在,想把该项目好好梳理一下要点,于是有了这篇博文....

E-R图

该项目涉及到了5个表:user、orders、orderItem、category、book

难点

E-R图设计中最难的地方就是做到订单模块那里.....

难点一

首先,要明白为什么在订单模块中设计Orders和OrderItem表两张表,而不是一张表Orders就搞掂了...当然了,这也可参考购物车案例的设计【Cart、CartItem】

  • 因为订单模块分了两个部分,一部分是显示普通的订单信息【定单人、价钱、订单时间、订单状态】
  • 而在后台中,我们还要在显示订单普通信息时,给予查看详细信息的功能【也就是订单的具体内容:具体的商品价钱、数量】

难点二:

订单模块我是最后才开始写的,订单模块和用户模块、图书模块都有相连,这就复杂了不少....

  • 一个用户可以拥有多个订单
  • 一个订单对应多个订单项
  • 一本图书对应多个订单项

难点三:

在实体的设计上,一般地,一对多的关系我们都是在多的类上使用变量了来记住一的关系。例如:在分类和图书一对多的关系中,我就是在Book类用category_id来记住分类的关系

但是呢,在订单和订单项的关系中,这样是行不通的。

不能在订单项类上用一个变量来记住订单【我们在前台生成订单,普通的订单信息可以直接生成。当我们想查看详细信息时,是不能把订单和订单项连接起来,从而得到订单项的具体信息的】

所以说,当生成订单的时候,也应该把所有订单项也一起封装到订单中...因此,我们这样做:在订单中维护一个Set集合来装载着所有的订单项.. 这也有购物车案例的味道【Cart使用Map集合来存储CartItem】....

  • --------更新----------------

现在看回之前的理解,感觉错了。其实我们不用纠结一的一方还是多的一方怎么维护变量在代码中,我们是使用Book实体定义一个变量来维护Category的关系的。我认为也做得不合适。对于一对多,多对一,多对多的关系,我们只要遵循一个原则: 在显示某一方的时候,是否需要另一方的数据 如果是,那么就在实体中使用一个变量来维护它 如果不是,我们就不用使用变量来维护它 比如,当我们点击分类的时候,是否需要把该分类下的所有图书查询出来?是。那么我们就应该在Book实体中使用一个List变量来维护它俩之间的关系。而之前写的代码,明明在显示图书的时候,就不需要把分类的信息查询出来,我们却用了一个变量来维护它。虽然效果还是做出来了,**但是这样是反逻辑的。**在之前做的时候,根据分类的id来获取对应的图书,SQL语句是很容易理解,但是,我们在页面上,明确的是点击分类来获取该分类下的图书。虽然结果是一样的,但从逻辑上就说不过去了。 而我们要是用分类维护List变量的话,那我们在查询的使用就需要用到两张表而已,把List封装到Category对象上,在需要得到分类下的书时,我们还是可以完成需求的。 ~~ 我觉得Book实体也不用使用变量来维护Category的关系了。~~ ~~ 还有一点需要说明的是:我们分类后的图书是要做分页的,那如果我们现在这样的话,怎么做???这样思考的话,好像又变得复杂下去了...~~ ~~ - 容我再思考一下。。。。。~~

  • --更新-----------------------

现在思考完,应该是这样子的:

  • 在一对多和多对一的情况下,我们在考虑需不需要使用一方来维护另一方的时候。在原则上,我们都是使用多的一方来维护一的一方。
  • 那为什么有的时候,上面这句话就不成立了呢??是这样子的:当我们一的方在页面展示的时候,多的一方数据需要同时展示。此时,我们就需要在一的一方使用集合来维护多的一方了。比如:我们查看订单的时候,就肯定需要同时把所有的订单项都查询出来的。当查看购物车的时候,就肯定需要同时把购物项查询出来的
  • 而我们的分类与书籍就没有同时这个概念。在页面上,我们是点击分类,才需要把书籍查询出来。因此,我们是使用多的一方来维护一的一方。
  • 如果使用了一的一方来维护多的一方的话,那么一般都没必要在多的一方来使用变量来维护一的一方了[参照订单与订单项]

项目中遇到的要点

  1. 在Tomcat中创建文件夹不能是manager,不然会出现403 Access Denied错误
  2. frameset标签是可以嵌套的,分列用“cols”,分行用“rows”,在src后指定target,后面request跳转显示的页面都是在target指定的页面上
  3. 实现分页主要在Page类上编写代码,在DAO层中要获取总记录数、分页数据。start和end参数是通过currentPage和linesize来计算出来的。
  4. 获取分类后的分页数据,需要在DAO层中获取分类后的总记录数,以分类作为WHERE条件得到分页数据
  5. 提交表单中有上传文件的话,我们可以使用FileUpload组件。普通字段我们使用BeanUtils的setProperty()来封装数据到Bean对象上,文件我们就写到服务端的指定目录下
  6. 在分帧页面上,如果首页就要显示数据了,我们可以在frame标签的src上指定的是Servlet,Servlet再跳转回JSP,这样JSP页面就有数据了!
  7. 如果想要div不全是浮动,我们可以在后边跟一个清除浮动的div。<div style="clear: both"></div>
  8. 想要页面上的按钮能够完成对应的功能,需要用到JavaScript代码,通过DOM编程得到对应的数据,使用window.location.href,让它跳转到对应的Servlet上实现功能
  9. Cart和CartIem的设计上,CartItem的总价是数量*价钱,Cart的总价是全部CartItem的价钱之和。
  10. Cart应该提供把商品加到购物车的功能,判断该商品的购物项是否存在,不存在着创建并保存在里边。存在则购物项的数量+1
  11. BussinessService提供购买功能,参数是Cart和Book。
  12. 用户想要购买商品时,判断用户是否登陆了,还要判断购物车是否存在【购物车使用Session来保存】,不存在则创建。
  13. Mysql中不能将表命名为“order”,这样会出错
  14. 订单的基本信息可以在Cart和User中获取,订单项的基本信息可以在CartItem中获取。因此,在BussinessService中需要Cart【通过Cart就可以找到CartItem了】和User参数。
  15. 在生成订单的Dao中,需要把订单的基本信息,订单项的基本信息封装到数据库中
  16. 通过id查找订单的时候,先找出订单的基本信息订单表和用户表联结,就可以查找出订单的用户。通过id也就可以查找出订单中所有的订单项了。最后把查找出来的数据全部封装到订单对象上。
  17. 想要让未发货的订单变成已发货,其实就是更新订单的状态。得到未发货的全部订单和已发货的全部订单,其实就是检索出不同状态的全部订单
  18. Dao层中,我们需要的参数往往是单一的,要么是具体的对象,要么就是id...然而在Service层中,我们要的参数是与该实体类相连的
  • 例子1:在生成订单的时候,Dao层仅仅需要Order对象参数。在Service层中,Order需要把User、Cart的数据封装到Order对象中,于是就需要了这两个参数
  • 例子2:Cart提供了把商品添加到购物车的功能,参数只需要具体商品的id。而在Service中,它需要用户的购物车对象和具体商品的id。

如果您觉得这篇文章帮助到了您,可以给作者一点鼓励

bookStore项目总结相关推荐

  1. 十八、部署 Vue.js 项目到生产环境

    本章概要 构建发布版本 部署 项目开发完毕并测试后,就要准备构建发布版本,部署到生产环境. 18.1 构建发布版本 在构建发布版本前,注意将项目代码中用于调试的 alert.debugger.cons ...

  2. 如何在 SAP BTP 平台上重用另一个已经开发好的 service

    假设我们的 SAP Business Technology Platform 平台上已经开发好了一个 products-service 项目: 我们希望在另一个 bookstore 项目里,重用 pr ...

  3. 周志明:《凤凰架构:构建可靠的大型分布式系统》

    架构模式的每一次演进都是凤凰涅槃 系统架构的每一次迭代都是浴火重生 构成系统的每一个部件都是一只不死鸟 构成大规模系统的每一个部件都可以是不可靠的,会出错,会老朽,甚至是消亡,如何让不可靠部件构成的系 ...

  4. abp 链接本地mysql_abp vNext 使用Mysql 数据库

    1. 环境 编译器 vs2019 运行时 dotnet core  2.2 数据库 Mysql 5.8 2. 开发准备 使用abp 官方提供的 CLI工具 创建时因为网络原因会连接失败,幸好abp中文 ...

  5. mobx在react中应用_借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNative应用...

    mobx在react中应用 by Qaiser Abbas 由Qaiser Abbas 借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNa ...

  6. Bookstore Postgres数据库项目

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_41099561/article/ ...

  7. web项目中的web.xml元素解析

    2019独角兽企业重金招聘Python工程师标准>>> 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字 ...

  8. 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub

    GitHub项目地址: https://github.com/Skymqq/LitePalSave.git LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)映射的模式 ...

  9. 网上书城java负责_网上书城项目总结(servlet_jsp+javaBean)

    网上书城项目总结 1 项目大纲设计: 需求分析 系统设计 详细设计 权限设计 2 技术选型: Servlet+jsp+javaBean Listener+Filter+jstl+fileupload+ ...

最新文章

  1. 用脑电波玩游戏,这款VR体验逆天了
  2. BZOJ 1084: [SCOI2005]最大子矩阵
  3. 人工智能和人类智能的类比
  4. 互联网1分钟 |1220
  5. HNOI2013 游走
  6. yii框架phpexcel
  7. python3爬取带密码的网站_Python3 爬取网站收藏数超过70的 情侣网名
  8. 如何运用领域驱动设计 - 领域服务
  9. 电脑的发展史_互联网发展史 硅谷传奇之 IBM
  10. 《linux就该这么学》第六节,计划任务和用户身份管理!
  11. java 基本集合操作
  12. ad13批量安装元件库_AD18元件库下载及导入方法
  13. Python实时爬取斗鱼弹幕
  14. 清理浏览器html缓存图片吗,在JSP或Javascript中清除浏览器缓存中的图像
  15. 前端弹出对话框 js实现 ajax交互
  16. 【R语言数据科学】(十二):有趣的概率学(上)
  17. 微淼商学院php面试_微淼商学院校友故事:培养财商,生活会越过越好
  18. 文章标题 execution(* cn.sxt.dao.impl.*.*(..))解释
  19. 如何利用小程序布局社交电商?
  20. [ODBC Driver 18 for SQL Server]SSL 提供程序: 证书链是由不受信任的颁发机构颁发的

热门文章

  1. 【iOS】iOS开发之使用Mac自动操作制作@1x@2x@3x图片(切图)
  2. LeetCode 200. Number of Islands
  3. mysql curd语句_MySQL常用SQL语句(CURD,建表,加字段,查改参数)
  4. 查看AIX系统cpu、内存、网卡、硬盘、HBA卡信息命令
  5. OpenCV3 for python3 学习笔记3-----用OpenCV3处理图像2
  6. 【 58沈剑 架构师之路】4种事务的隔离级别,InnoDB如何巧妙实现?
  7. 企业上云势不可挡 安全策略该如何制定?
  8. 《Java虚拟机原理图解》1.1、class文件基本组织结构
  9. Spark UI (基于Yarn) 分析与定制
  10. POJ 2991 Crane(线段树+计算几何)