JavaWeb项目实战:图书商城
网上书城
一.搭建环境
1.导入原型
- 用户模块
- 分类模块
- 图书模块
- 购物车模块
- 订单模块
2.功能分析
前台 :
- 用户模块 (注册-有限激活-登录-退出)
- 分类模块 (查看所有分类)
- 图书模块 (查看所有图书,按分类查询,查询图书详细(按id查询) )
- 购物车模块 (添加购物车条目,清空所有条目,删除指定条目,我的购物车(按用户查询购物车))
- 订单模块 (生成订单,我的订单(按用户查询订单),按id查询订单,确认收货,付款功能(只是跳转到银行页面))
- 付款回调(由银行调用我们这个方法,表示用户已经付款成功)
后台:
- 管理员(登录)
- 分类管理(添加分类,查看所有分类,删除分类,按id查询,修改分类)
- 图书管理(查看所有图书,按id查询,删除图书,修改图书,添加图书(上传图片) )
- 订单模块 (查询所有订单,按状态查询订单,发货)
3.1-导包
- 数据库:MySQL驱动,c3p0jar包和配置文件,dbutils,itcast-tools(commons-beanutils,commons-logging)
- javamail :mail.jar activation.jar
- 上传 :commons - fileupload,commons-io
- Ajax :json-lib
3.2-创建package
根:com.tinstu.bookstore
--->user
- domain
- dao
- service
- web.servlet
--->category
- domain
- dao
- service
- web.servlet
--->book
- domain
- dao
- service
- web.servlet
--->cart
- domain
- web.servlet
--->order
- domain
- dao
- service
- web.servlet
3.创建数据表
- t_user
- t_category
- t_book
- t_
用户模块
1.用户模块相关类的创建
- domain:User
- dao : UserDao
- service : UserDao
- web.servlet:UserServlet
2.用户注册
流程:/jsps/user/regist.jsp --> UserServlet#regist( ) --> msg.jsp
页面:
-->regist.jsp
- 表单页面,请求UserServlet#regist( )方法
- 参数:整个表单数据
-->msg.jsp
Servlet:
--> UserSerlet#regist( )
- 一件封装表单数据到User form 对象
- 补全:uid,激活码
- 输入校验:
- --▶保存错误信息到request
- --▶保存当前表单数据(form)到request(回显)1;
- --▶转发回到regist.jsp
- 调用Service的regist( ) 方法,传递form
- --▶如果抛出异常:保存错误信息(异常信息),保存表单数据(回显),转发regist.jsp
- --▶如果没有抛出异常:发邮件(发件人,收件人,标题,内容(内容中包含超链接,指向可完成激活的servlet地址,连接中要有激活码参数))->保存成功信息到request->转发msg.jsp
Service:
-->UserService#regist(User user)
- 校验用户名是否被注册,如果注册,抛出UserException
- 校验邮箱是否被注册,如果注册,抛出UserException
- 把user插入到数据库中
Dao:
User findByUsername(String username):按照用户名查询用户
User findByEmail(String email):按email查询用户
void add(User form ): 插入用户到数据库中
3.用户激活
流程:用户的邮件中 --> UserServelt#active --> msg.jsp
4.用户登录
5.用户退出
分类模块
1.分类模块的相关类创建
com.tinstu.store.category
- domain : Category
- dao : Category
- service : CategoryService
- web.servlet : CategoryServlet
2.查询所有分类
流程 : main.jsp(iframe)--> CategoryService#findAll( ) --> left.jsp
<for:each items="不可有空格">
图书模块
1.创建相关类
com.tinstu.store.book
- domain: Book
- Dao : BookDao
- service : BookService
- web.servlet :BookServlet
2.查询所有图书
流程: left.jsp(全部分类)-->BookServlet#findAll( ) --> /jsps/book/list.jsp
service和dao 略!!!
购物车模块
购物车存储种类:
- 保存在session中
- 保存在cookie中
- 保存在数据库中
1.创建相关类
购物车的结构
- CartItem :包含图书和数量
- Cart : 包含一个Map<String CartItem>
- dao :没有
- service :没有
- web.servlet :提供!
修改登录方法,在用户登录成功后添加一辆车
页面:/jsps/cart/list.jsp
它只有一个任务,就是遍历车!
车在session中,通过车可以得到所有的CartItem
2.添加购物车的条目
3.清空条目
4.删除购物车条目
5.我的购物车
top.jsp中存在一个链接: 我的购物车
我的购物车直接访问 /jsps/cart/list.jsp,它会显示session中车的所有条目
1.订单模块介绍
1.创建相关类
- domain :Order / Orderitem
- dao :OrderDao
- service : OrderService
- web.servlet:OrderServlet
2.生成订单
3.我的订单(按用户查)
4.加载订单(按id查)
5.确认收货
易宝支付 :
6.支付(去银行)
7.支付(银行的回馈)
后台的内容,必须要设置权限
用户可以访问一个网站的那些内容?
- dao:不行
- service:不行
- servlet :能
- jsp :能
用户可以访问的只有web层!
1.分类管理
- 分类管理(添加分类,查看所有分类,删除分类,按id查询,修改分类)
- 图书管理(查看所有图书,按id查询,删除图书,修改图书,添加图书(上传图片) )
1.1 相关类创建
- domain:Category (已写)
- dao: CategoryDao (已写)
- service :CategoryService (已写)
- admin.web.servlet: AdminCategoryServlet (为管理员提供单独的servlet,然后给这个servlet添加过滤器!)
1.1.1.Q6MenuBar小工具
风琴式下拉菜单
在adminjsps/admin/book/left.jsp中有相关注释
1.2.后台分类管理之查询所有分类
- list.jsp 上的菜单修改一下指向:AdminCategoryServelt#findAll ( )
- findAll ( ):
- >>>调用service得到所有分类List<Category>
- >>>保存到request域中,转发到/adminjsps/admin/category/list.jsp
- list.jsp:修改页面,查看所有分类
1.3添加分类
- add.jsp (表单页面)
- AdminCategoryServlet#add ( ):
- >>>>封装表单数据
- >>>>补全:cid
- >>>>调用service方法完成添加工作
- >>>>调用findAll( )方法
- service#add(Category c) :略
- dao#add(Category c):略
1.4 删除分类
- list.jsp (删除链接)
- AdminCategoryServlet#delete ( )
- >>>获取参数:uid
- >>>调用service方法删除!
- >>>>>>如果出现异常,保存异常信息,转发到msg.jsp中显示
- >>>调用findAll( )
- service#delete(String uid):
- >>>通过uid查看该分类下的图书本数,如果大于0,抛出异常
- >>>如果等于0,删除该分类
1.5修改分类
修改分为两步:1.加载分类 2.修改分类
- list.jsp 修改链接 -->
- AdminCategoryServlet#editPre ( )
- ---->获取uid
- ---->通过uid来调节service方法,得到Category对象
- ---->保存到request域中,转发到mod.jsp
- mod.jsp:把当前的Category对象显示到表单中
第二步:修改分类
- mod.jsp(提交表单)
- AdminCategoryServlet#edit ( )
- ---->封装表单数据
- ---->调用service方法完成工作
- 调用findAll ( )
->图书管理(我的)
- 查看所有图书
- 按id查询
- 删除图书
- 修改图书
- 添加图书(上传图书)
2.1相关类创建
- web.servlet.admin:
- --(AdminBookServlet)
- --(AdminBookServlet)添加图书,包含上传:上传不能使用BASEServlet,因为BASEServlet中需要使用getParameter()方法,而上传getParameter方法就不能继续使用了.
2.2查询所有图书
- left.jsp(菜单项(查看图书链接))
- AdminBookServlet#findAll( )
- --->查询所有图书,保存到request域中
- --->转发到 /adminjsps/admin/book/list.jsp
- list.jsp:循环遍历所有图书
2.3加载图书
- list.jsp(点击图片或图片)
- AdminBookServlet#load( )
- ----->获取bid,通过bid调用BOOKServlet方法得到Book对象
- ----->保存request中,转发/adminjsps/admin/book/desc.jsp
- desc.jsp:把当前book对象显示到表单中
2.4添加图书
添加图书分为两步:
1..加载所有分类,到add.jsp中显示
- left.jsp(菜单项,添加图书)
- AdminBookServlet#addPre ( ) :
- ------->查询所有分类,保存到request域,转发到add.jsp
- 在add.jsp中循环遍历所有分类,显示在<select>中
2.添加图书:
- 上传三步(1.创建工厂,2.创建解析器,3.创建request得到表单字段)
- 把表单字段封装到Book对象中
- 保存上传文件,把保存的路径设置给Book的image属性
- 调用service方法保存到Book对象的数据库中
- 调用finAll ( )
2.5 删除图书(假删除)
book表与orderitem有关联关系!
删除图书不是真在数据库中删除该数据,而是给book表一个dele字段,他是布尔类型,表示是否已经删除!
没有被删除的图书,该列的值为false,否则为TRUE
处理问题:
- 修改BookDao:所有与查询相关的方法,都需要添加where条件,即del=false
- 修改Book类,添加dele属性!
删除图书:其实就是把表的dele列,修改为true!
- desc.jsp (dele按钮)
- AdminBookServlet#del ( )
- ----->获取bid
- ----->调用service方法完成删除
- ----->返回列表,即调用fandAll ( )