bookStore项目总结
感想
该项目是目前为止,我写过代码量最多的项目了…..虽然清楚是没有含金量的【跟着视频来写的】,但感觉自己也在进步中…..
写的过程中,出了不少的问题…..非常多的Servlet,JSP看得眼花…..
现在,想把该项目好好梳理一下要点,于是有了这篇博文….
E-R图
该项目涉及到了5个表:user、orders、orderItem、category、book
难点
E-R图设计中最难的地方就是做到订单模块那里…..
难点一
首先,要明白为什么在订单模块中设计Orders和OrderItem表两张表,而不是一张表Orders就搞掂了…当然了,这也可参考购物车案例的设计【Cart、CartItem】
- 因为订单模块分了两个部分,一部分是显示普通的订单信息【定单人、价钱、订单时间、订单状态】
- 而在后台中,我们还要在显示订单普通信息时,给予查看详细信息的功能【也就是订单的具体内容:具体的商品价钱、数量】
难点二:
订单模块我是最后才开始写的,订单模块和用户模块、图书模块都有相连,这就复杂了不少….
- 一个用户可以拥有多个订单
- 一个订单对应多个订单项
- 一本图书对应多个订单项
难点三:
在实体的设计上,一般地,一对多的关系我们都是在多的类上使用变量了来记住一的关系。例如:在分类和图书一对多的关系中,我就是在Book类用category_id来记住分类的关系
但是呢,在订单和订单项的关系中,这样是行不通的。
- 不能在订单项类上用一个变量来记住订单【我们在前台生成订单,普通的订单信息可以直接生成。当我们想查看详细信息时,是不能把订单和订单项连接起来,从而得到订单项的具体信息的】
- 所以说,当生成订单的时候,也应该把所有订单项也一起封装到订单中…因此,我们这样做:在订单中维护一个Set集合来装载着所有的订单项..
- 这也有购物车案例的味道【Cart使用Map集合来存储CartItem】….
项目中遇到的要点
- 在Tomcat中创建文件夹不能是manager,不然会出现403 Access Denied错误
- frameset标签是可以嵌套的,分列用“cols”,分行用“rows”,在src后指定target,后面request跳转显示的页面都是在target指定的页面上
- 实现分页主要在Page类上编写代码,在DAO层中要获取总记录数、分页数据。start和end参数是通过currentPage和linesize来计算出来的。
- 获取分类后的分页数据,需要在DAO层中获取分类后的总记录数,以分类作为WHERE条件得到分页数据
- 提交表单中有上传文件的话,我们可以使用FileUpload组件。普通字段我们使用BeanUtils的setProperty()来封装数据到Bean对象上,文件我们就写到服务端的指定目录下
- 在分帧页面上,如果首页就要显示数据了,我们可以在
frame标签的src上指定的是Servlet,Servlet再跳转回JSP,这样JSP页面就有数据了! - 如果想要div不全是浮动,我们可以在后边跟一个清除浮动的div。
<div style="clear: both"></div> - 想要页面上的按钮能够完成对应的功能,需要用到JavaScript代码,通过DOM编程得到对应的数据,使用
window.location.href,让它跳转到对应的Servlet上实现功能 - Cart和CartIem的设计上,CartItem的总价是数量*价钱,Cart的总价是全部CartItem的价钱之和。
- Cart应该提供把商品加到购物车的功能,判断该商品的购物项是否存在,不存在着创建并保存在里边。存在则购物项的数量+1
- BussinessService提供购买功能,参数是Cart和Book。
- 用户想要购买商品时,判断用户是否登陆了,还要判断购物车是否存在【购物车使用Session来保存】,不存在则创建。
- Mysql中不能将表命名为“order”,这样会出错
- 订单的基本信息可以在Cart和User中获取,订单项的基本信息可以在CartItem中获取。因此,在BussinessService中需要Cart【通过Cart就可以找到CartItem了】和User参数。
- 在生成订单的Dao中,需要把订单的基本信息,订单项的基本信息封装到数据库中
- 通过id查找订单的时候,先找出订单的基本信息。订单表和用户表联结,就可以查找出订单的用户。通过id也就可以查找出订单中所有的订单项了。最后把查找出来的数据全部封装到订单对象上。
- 想要让未发货的订单变成已发货,其实就是更新订单的状态。得到未发货的全部订单和已发货的全部订单,其实就是检索出不同状态的全部订单。
- 在Dao层中,我们需要的参数往往是单一的,要么是具体的对象,要么就是id…然而在Service层中,我们要的参数是与该实体类相连的。
- 例子1:在生成订单的时候,Dao层仅仅需要Order对象参数。在Service层中,Order需要把User、Cart的数据封装到Order对象中,于是就需要了这两个参数。
- 例子2:Cart提供了把商品添加到购物车的功能,参数只需要具体商品的id。而在Service中,它需要用户的购物车对象和具体商品的id。
bookStore项目总结的更多相关文章
- abp示例项目BookStore搭建部署
之前部署过BookStore项目,但是换了新电脑也想好好学习下这个示例项目,于是在新电脑上重新拉了Git上的ABP项目代码,一编译生成BookStore项目就报错,可以参考 abp示例项目BookSt ...
- BookStore示例项目---菜单栏UI分析
部署 参照 ABP示例项目BookStore搭建部署 项目解构 1).动态脚本代理 启动项目时,默认会调用两个接口 /Abp/ApplicationConfigurationScript /Abp/S ...
- 解读ASP.NET 5 & MVC6系列(2):初识项目
初识项目 打开VS2015,创建Web项目,选择ASP.NET Web Application,在弹出的窗口里选择ASP.NET 5 Website模板创建项目,图示如下: 我们可以看到,此时Web ...
- 解读ASP.NET 5 & MVC6系列(3):项目发布与部署
本章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例. 发布前的设置 由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前 ...
- MVC6项目
解读ASP.NET 5 & MVC6系列(2):初识项目 2015-05-14 09:08 by 汤姆大叔, 2866 阅读, 19 评论, 收藏, 编辑 初识项目 打开VS2015,创建We ...
- 为bookStore添加权限【动态代理和注解】
前言 目前为止,我们已经学习了动态代理技术和注解技术了.于是我们想要为之前的bookStore项目添加权限控制-.. 只有用户有权限的时候,后台管理才可以进行相对应的操作-.. 实现思路 之前我们做权 ...
- ASP.NET MVC 5 05 - 视图
PS: 唉,这篇随笔国庆(2015年)放假前几天开始的,放完假回来正好又赶上年底,公司各种破事儿. 这尼玛都写跨年了都,真服了.(=_=#) 好几次不想写了都. 可是又不想浪费这么多,狠不下心删除.没 ...
- 实验七 Web应用测试
实验目的 (1) 了解Web应用测试的特点 (2) 掌握SSH分层单元测试 实验内容 以下题目均在bookstore项目上完成(请先运行数据库文件): 1.编写单元测试用例,对 ...
- 如何写好git commit message
1.触发事件 我有这样一个版本库,里面包含两个学习用的练习项目:BookStore(以下简称BS)和PictureFriend(以下简称PF) 我在更改PF以后,未进行提交,同时又到BS中优化了一下文 ...
随机推荐
- .Net高级进阶,WebApi和MVC进行模型验证的时候,教你如何自由控制需要进行验证的字段?
现在,你有一个MVC架构的web项目,你要完成一个注册功能. 前台传了3个值到你的控制器,分别是账号.密码.邮箱. 如图:现在你要在控制器里面判断,账号名称.密码.邮箱不能为空,并且名称和密码不超过1 ...
- .net Path 类
检索文件扩展名. GetExtension 检索文件的完全限定路径. GetFullPath 检索路径中的文件名和扩展名. GetFileName 只检索路径中的文件名. GetFileNameW ...
- 通过maven test 报org.apache.ibatis.binding.BindingException: Invalid bound statement
背景 直接使用eclipse工具去执行,没有问题,通过testng.xml去执行,没有问题,但通过mvn clean test执行,就报错,提示org.apache.ibatis.binding.Bi ...
- Windows8.1 与Ubuntu14.04双系统
机型:联想 Y480 现有操作系统:win8.1 64位 物理内存:8G 磁盘存储:两个硬盘 1. SSD为固态盘 Solid State Drives 110G 现已安装有win8系统 2.H ...
- 部署和使用kibana
背景 上一篇介绍了在阿里云上部署ES,本文将主要介绍ELK的可视化工具Kibana的部署和使用.主要分为三个步骤来实现最终呈现: 1.导入数据到ES: 2.部署kibana并完成配置: 3.使用kib ...
- sublime text3开发python并设置快捷键
Package Control 安装方法 1.通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴相应的 Python 安装代码: 2.Sublime T ...
- JavaScrpt笔记之第二天
JavaScript正则表达式regex 1.郑则表达式是有一个字符序列形成的搜索模式. *语法:/正则表达式主题/修饰符(可选) *正则表达式修饰符:i部分大小写:g全局搜索:m多行匹配 *[abc ...
- Android滑动控件.md
1.概述 最近写代码临时加了个功能主要是滑动选择的功能效果图如下: 2.代码 这里主要是用属性动画做的 <ImageButton android:id="@+id/fab" ...
- IO库
IO类 C++语言不直接处理出入输出,而是通过一族定义在标准库中的类型来处理IO.这些类型支持从设备读取数据.向设备写入数据的IO操作,设备可以是文件 .控制台窗口 等.还有一些类型允许内存IO ,即 ...
- 初学者入门web前端:C#基础知识:函数
入行前端对函数的掌握程度有可能直接影响以后工作的效率,使用函数可以高效的编写编码,节省时间,所以我整理了C#中最基础的函数知识点,虽然我在学习中 遇到很多问题,但是只要能够解决这些问题,都是好的. 一 ...