Java Web(十四) 编写MyBookStore项目的总结
这几天一直没有发博文,原因是在写一个书城的小项目,作为web学习的最后沉淀,接下来就要到框架的学习了。
--WH
一、项目介绍
从网上找的一个培训机构的小项目,名称叫做 书城购物网站 吧,其中就是分前后台,前台用于显示各种类型的书籍商品,可以用于加入购物车,可以购买付款下单,后台就用来对书籍、书类别的增删改,和对订单的处理。一个不是很复杂的项目,但是在没开始编写之前,确实是毫无头绪,无从下手,那是因为没有对该项目有一个大体的认识,不知道其中的层次模块,所以不好从哪里开始着手去写代码,等会听我慢慢道来,我会把我编写的思路和你想法一步步告诉大家,在之前,先把效果给大家看一下吧。
前台首页
没登录之前,可以查看全部书籍商品,也就点击全部分类即可,也可以通过分类找到对应类别的书籍(每页显示12个商品,有分页功能)
然后进行注册,这里用了AJAX对注册的用户名进行了校验,为了不让重名,并且可以发送激活码的邮件对帐号进行激活,没激活的用户是登录不了的。
登录之后,加入商品到购物车
、
对自己的订单进行查看(提前已经有数据的),一些订单还没有付款就可以进行付款,付款了就等待后台点击发货,发了货就等待自己点击确认收获即可。
对订单付款,选择其一个银行就会跳转到哪个银行的页面进行付款,作为实验,每次只会付一分钱,付给的是一个测试帐号。也可以自己去申请,用的是易宝支付平台
前台大概就是这样了,现在来说说后台的东西,后台很简单。就管理这些商品即可。
后台首页
其中的功能已经在左边的列表中清清楚楚的写着了,对分类,图书和订单进行管理,包括增删改查操作。这里就不做过多介绍了,对订单的管理有一个小的逻辑管理,可以对已经付款的订单进行发货处理,那么就等待前台用户点击确认收获,确认收获后,就成了已经完成的订单了。
二、分析项目结构模块
刚开始拿到这个项目的前端架子时,只能说,看起来很简单的几个操作,也就登录,注册,查看书籍信息,加入购物车,付款下单,点来点去就这样几个页面,但是让自己拿起来实现,确实是没一点头绪,不过写完了,就会对这个项目有一个总体的了解,就相当于,一开始用2D画面,现在是用上帝视角在看这个项目,一目了然的感觉。先来写说说编写思路。
首先要看懂数据库的设计,理清楚关系,然后了解项目需要分哪几个模块。搞懂了这几个,基本上就有个大概的了解,就可以动手写代码实现了。
2.1 数据库设计。
五张表,现在一个个来分析,
user表,用来进行登录注册,对用户进行识别和管理的。
uid:唯一识别码,采用UUID获得一个32位的字符串,用于标识该用户。
username:登录时的用户名,唯一,不能重复。
password:登录密码,并没有加密,按常理应该会使用加密,这样到数据库中查看数据也看不到原始密码。
email:邮箱,用于接收激活邮件
state:是否激活的状态标识。1为激活,0为未激活
cdkey:激活码。
为了了解其中的email,state,cdkey三个字段,就要知道发送激活码邮件的流程,首先注册时候,state为0,未激活状态,注册会创建一个激活码,假设为123,cdkey=123,然后通过email,用户留下来的邮箱,往该邮箱发送一个激活邮件,内容为一个 超链接,超链接中会带两个参数,一个参数存放这123,一个参数存放uid,标识该用户,点击超链接就会跳转到一个处理激活的servlet中,将拿到的激活码参数内容跟数据库中cdkey对比,看是否一样,一样的话,那么就为激活了,利用uid将用户state改为1,如果不一样,说明不是该用户点击激活码邮件过来的,不作处理。
category表,图书分类的类别表,比如玄幻,言情等。该表比较简单,看上面的项目介绍,就能够知道,主页中旁边的类别就是从该表中拿到的数据。
cid:唯一标识码,同样使用uuid,获得32位字符串来充当该值
cname:类别名称。
book表,书籍表,用于存放所有的书籍信息。
bid:唯一标识码
bname:图书名称
price:图书价格,采用的是decimal类型,保留2为小数点的。也就是价格精确到分
author:图书作者
image:图书的图片,存放的是图片的路径,而不是将图片存放在数据库中
cid:指向category表中的cid字段,是一个外键字段,作用是标识该本书籍是属于哪个类别的。
isdel:这个是图书的状态,是否下架?这个字段在我写的项目中并没有用到,我没有编写这块的逻辑代码。
分析下来,就将book表跟category表联系起来了,每本书都会有一个专属的类别,这样就可以通过类别来查询对应的书籍了,想一想前台主页上的通过分类查找到对应书籍进行显示,就是通过这两张表的关系来解决的。
orders表,订单表
oid:唯一标识码
total:价格,也就是这个订单中可能有多个商品,多个商品的总价格就为total
ordertime:下单的时间,类型,time
state:订单的状态,有四个状态,分别用1,2,3,4来识别,1:未付款,2:已经付款,待发货,3:已发货,待收货,4:已经收货,订单完成,
address:地址,送货肯定需要一个地址。
uid:指向user表中的uid字段,是一个外键字段,标识着该订单是哪位用户的。
通过orders表,就将user表给联系起来了,到时前台要显示每位用户自己的订单时,就通过orders表中的uid字段,来查询自己所有的订单。
orderitem表,订单项目表,因为一个订单中可能有多个商品,那么每个商品都要生成一个orderitem记录,这样通过一个订单就可以查找到该订单中有多少个商品。
itemid:唯一标识码
count:一件商品购买的数量,比如买A这本书一次买了两本,由于是两本A书,那么就不用生成两个orderitem记录了。
subtotal:总价为多少
bid:指向book表的bid,为一个外键字段,标识着该订单项是哪本书籍
oid:指向orders表中的oid,为一个外键字段,标识着该订单项是属于哪个订单的。
该表就将三个表联系在一起了,book表,orders表,orderitem表,user表。他们的关系应该也清楚了,一个orders表中的一条记录为一个订单,该订单是属于谁的(通过订单中的uid字段),该订单中有多少种商品(通过orderitem表中的oid字段),订单中每种商品的信息(通过orderitem表中的bid字段)。其实我们说的就是一对多的对应关系,在多的一方存储外键字段。自己可以分析分析,这5张表之间的关系,通过谁可以查找到谁。
2.2 分析前台模块
用户模块
登录,注册
注册
AJAX异步校验用户名
发送激活邮件
激活完成
登录
判断用户帐号密码和是否激活,并将自身存入session中
退出
销毁session
类别模块
查询所有分类。
首页中显示分类信息,从category表中拿去所有类别信息
图书模块
显示所有图书,根据分类查询图书,根据图书id查询图书详细信息。
点击分类模块中的类别,就能将该类别下面的图书展示出来。点击全部分类,则将全部图书都显示出来,此处就是使用category表和book表结合查询,点击其中一本图书,将显示图书的详细信息,并且提示有购买的按钮,此按钮是将其图书加入购物车
购物车模块
添加到购物车,从购物车中移除商品,清空购物车
此处使用的是一个Map来充当购物车的容器,使用LinkedHashMap,优点是存取快捷,其原理为,创建一个 购物车项(cartItem)的javabean,其中有三个属性,book对象,有购买数量acount,还有总金额allMoney,用这三个属性来标识一个商品,购物车则用Map充当,Map<String,CartItem>。 String:装的是bid(book的唯一识别码),CartItem就是装的购物车项。
将 A 书加入购物车,
首先将A书封装成CartIitem对象,book属性就是A书的所有信息,acount代表这次加入购物车的A书有几本,allMoney代表总金额为多少,
封装成CartItem后,将其加入cart(购物车,也就是map集合)
通过A书的唯一识别码bid跟cart中的所有key值进行比较,判断cart中是否已经存在A书
如果存在A书,则找到cart中key为bid的cartItem,在往cartItem中修改acount和allMoney。
如果不存在A书,则将A书存入cart中,用A书的bid充当key值,用A书封装好的CartItem充当value,
将cart(购物车,也就是map集合)存入session作用域中,存session作用域的话,就不能永久保存该用户的购物车,根据session的特性,关闭浏览器还会默认保存30分钟,并且如果不将cookie设置在浏览器保存的话,关闭浏览器即丢失sessionId,session则找不到,也就是购物车中的内容就丢失了,所以存到session中的特点就是我说的那样,也可以将购物车存到数据库中,那么用户不管什么时候登录,在哪里登录,都能够找得到自己的购物车。
订单模块
生成订单,根据用户查询订单,根据订单id查询订单项,在线支付功能,修改订单状态
将商品加入购物车后,可以点击进行付款,此时会跳转到选择支付方式页面,并且生成订单,此时的订单state为1,为未付款状态,编写地址后,进行付款,跳到付款页面,付款成功后,会跳转回我们自己的页面,此时订单state为2.称为已付款代发货状态,在生成订单的同时,也会生成orderitem(订单项),也就是将每一件商品都生成订单项。其业务操作是在service层完成的。
2.3 分析后台模块
分类管理 对category表进行操作。
1、查询分类,将所有分类信息查询出来
2、添加分类,
3、修改分类
4、删除分类
图书管理
1、查询图书
将所有图书信息查询出来
2、添加图书
文件上传(将图片信息上传)
3、修改图书
修改图书图片或其他信息
4、图书下架(删除)
订单管理
1、查询所有状态的订单
2、查询出各个状态的订单(未付款,已付款待发货,已发货待确认收货,已确认收获订单完成)
三、编写流程
3.1、搭建项目环境
使用的是三层经典架构,web层、service层、dao层,如果想使用接口编程那么就在其中在进行分接口类和实现类。
我的包结构
将所有需要使用的jar包加入。
mysql:1个jar包
c3p0连接池:1个jar
dbutils框架:1个jar
文件上传:2个jar io和核心jar(fileUpload)
邮件发送:1个jar javamail
JSP:2个jar,jstl和el表达式(因为使用JSP,可能需要使用自定义标签或者别的标签,所以就先将其带入进来,以防不备之需)
beanUtils:2个jar beanutils和logging。(我没用beanUtils)
3.2、编写代码
1、开发环境搭建好之后,首先将使用dbutils框架将连接数据库的代码编写好。
2、按照上面的模块进行编写,首先是用户模块的注册,登录,从JSP写到Servlet到service层到dao层。就这样从前写到后的顺序编写。
3、其他就是按部就班了,当真正开始编写时,一切就会能按照自己的思路进行下去,而不是像一开始那样,无从下手。
3.3、注意,
这里编写servlet时使用了反射机制,目的是为了减少servlet的个数,而为了简化servlet个数的方式有两种。
第一种。
还是按照老的方式,继承httpServlet,重写doGet和doPost方法,在发送请求时,把需要访问的servlet方法用参数的方式传过去,然后在serlvet内部判断请求参数是需要调用哪个方法,将方法体都写在该servlet下面,在doget或者dopost方法内调用即可。
第二种
利用反射机制,反射加载对应方法。此时需要大家了解servlet的生命周期经历的三个方法,最重要的是知道访问servlet会进过service方法。知道了这个一切就好办了,编写一个通过的servlet,取名为BaseServlet。
分析:将所有的方法都写在一个新的servlet类中,该类就继承BaseServlet。当访问新的servlet类中,因为需要执行service方法,而子类中并没有,就到父类BaseServlet中去寻找并执行,在在父类中会将拿到要执行的方法名,通过反射机制,去执行子类中对应的方法,所以就将需要执行的方法和service只能够代码分离开了,在子类中全部都是需要编写的逻辑代码。不用对method进行判断从而选取对应方法进行执行,省去了很多麻烦,使代码更加简洁,易懂。
四、总结
通过这个项目,使自己对三层经典架构理解的更加深刻,并且对于web中的大大小小的知识点进行了巩固,JSP中的四大作用域,9大内置对象,el表达式的使用,发送邮件,在线支付环节等等很多知识,并且通过servlet+JSP+数据库的模式确实比较复杂,从而知道了使用框架的好处,便于开发。
现在献出该项目源代码,希望对大家有所帮助。
http://pan.baidu.com/s/1i4W79BZ 67me
Java Web(十四) 编写MyBookStore项目的总结的更多相关文章
- 实验十四:团队项目评审&课程学习总结
项目 内容 作业所属课程 所属课程 作业要求 作业要求 课程学习目标 (1)掌握软件项目评审会流程:(2)反思总结课程学习内容 任务一:团队项目审核已完成.项目验收过程意见表已上交. 任务二:课程学习 ...
- “全栈2019”Java第九十四章:局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十四章:二进制、八进制、十六进制
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- java web(学习笔记)项目路径问题
最近刚接触java web特别是是关于项目路径这一块很晕,就把自己遇到的一些疑惑和理解写下来. 首先贴上路径,这里用的是eclipse. 其中我们要注意看WebContent目录,这是web程序的根目 ...
- java web 学习四(http协议)
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
- Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用
前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...
- Java进阶(十四)实现每天定时对数据库的操作
Java实现每天定时对数据库操作 现在有一个很棘手的问题:客户要求实现一个功能,就是每日凌晨自动计算慢性病订单是否有需要在今日提醒的,如果有则生成一条提醒记录到lm_notice之中. 如何在Web工 ...
- Java Web(十二) JavaMail发送邮件
发送邮件的原理 概叙 邮件服务器: 要在 Internet 上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在 Internet 很多 提供邮件服务的厂商:sina.sohu.163 等等他们都 ...
随机推荐
- hdu-3790-最短路径问题(dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 这题cin会超时i 关于解决cin超时的问题 在main函数开头加上 ios::sync_wit ...
- bootstrap的alert提示框的关闭后再显示问题
bootstrap中有alert组件,如果点击关闭按钮后该组件会被删除而不是被隐藏,想再显示怎么办呢? bootstrap-alert.js源码片段: function removeElement() ...
- node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...
- Struts2标签--S:iterator----jsp页面遍历双层list
双层遍历,第一层list为classes,里面放的是班级class对象,第二层为班级class里的小组groups. <s:iterator value="classes&qu ...
- hessian原理解析一(客户端分析)
hessian 是一款开源的二进制远程通讯协议,使用简单方法提供了RMI功能,主要用于面向对象的消息通信. 优点:跨平台.多语言支持.使用简单 缺点:传递复杂对象性能会下降,不适合安全性高的应用 一 ...
- 对lua中_ENV表的理解(lua5.2版本以后)
当我拿到_ENV表的时候,会去想这个_ENV表是干什么用的? 首先看如下代码: print(_ENV) --0x1d005f0 print(_G) --0x1d005f0 ViewCode 看了上面的 ...
- Excel实用知识2(排序,筛选,分析工具)
[排序,筛选,分析工具(描述统计,相关系数,回归分析,抽样分析,预测工作表)] 纯手打,可能有错别字,使用的版本是office2013 转载请注明出处 http://www.cnblogs.com/h ...
- mac bash_profile
# This is the filename where your incoming mail arrives. MAIL=~/mbox MAILCHECK=30 HISTFILE=~/.histor ...
- 王爽汇编语言(第三版)环境搭建(附PDF及工具下载)
一.前言 最近在学习汇编语言,使用的是读者评价非常高的王爽老师写的<汇编语言>(第三版),为了适应现在各个版本的windows操作系统,所以采用VMWare虚拟机来搭建纯DOS环境. 二. ...
- oracle__wm_concat函数
首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行,接下来上例子,看看这个神奇的函数如何应用 准备测试数据 SQL> ...