经过一段时间的Java Web基础知识的学习,为了将整个知识点串联起来,自己写了一个简单的网上书城小项目。整个项目架构比较简单,适合像我这种Java Web初学者来学习参考,项目名称web_bookstore,是基于servlet/jsp和html/css/js实现的。
整个工程代码已push到Git,详见地址:web_bookstore。
该网上书城项目分为前台和后台两大部分,前台部分包括会员注册、会员登录、购买书籍、添加购物车、结算等功能,后台部分包括查看会员、查看商品、添加商品等功能。有些功能模块还未添加,后续需要的话可以再添加上去。整体架构框图如下所示:
通过看整体架构框图可知,整个项目各个模块之间关系还是挺清晰的,下面先来一张web_bookstore工程整体图:
src源码包说明:
WebContent文件说明:
工程整体大致就是这些,下面分模块大致梳理一下流程。
一般项目首先会设计数据表,那咱们就先说说数据表创建^_^。整个项目使用了5个数据表,分别是用户表、商品表、订单表、订单项表(订单中单个商品项信息)、消息表。具体的表结构和创建表SQL语句见源码中的db.sql文件。下面是整个个数据库的图示:
会员需要先注册后才能使用网上书城添加购物车和结算等功能,注意:会员注册后需要管理员激活该会员后才能登录。注册界面如下所示:
会员注册成功后,就可以直接登陆到网上书城了,登录界面如下所示。注意,如果是管理员登录的话,会跳转到后台管理员主页;如果是普通会员的话就会跳到会员主页。
会员成功登陆后,服务端会生成对应的Cookie,并写入请求响应中,Cookie格式为user=user_id形式,user_id为用户注册后生成的一个对应id。
接着就会跳转到商品主页上去,商品主页页面如下所示,目前商品表中只有2件商品:(
在商品下面点击加入购物车后就会将该商品添加到购物车中。
注意:购物车是以Session形式保存在服务端的,因为网上书城是多用户登录的,如何保证多个用户的Session不冲突呢,也就是购物车是如何实现的呢?一个用户的购物车在服务端对应一个Session,该Session对应的属性名字为cart+user_id,user_id也就是用户登录成功写入到Cookie的那个user值,因为cart+user_id是和用户一一对应的,所以这样就保证了所有用户的Session不会冲突,对应的源码在AddCarServlet逻辑中,如下所示:
// 先判断用户是否登录 Cookie cookie = ServletUtils.getCookie(request, "user"); if (cookie == null) { response.getWriter().println("抱歉,你当前还未登录,2秒后调到登录页面"); response.addHeader("refresh", "2;url=" + request.getContextPath() + "/client/login.jsp"); return; } // 获取购物车对象 HttpSession session = request.getSession(); Map<Product, Integer> cart = (Map<Product, Integer>) session.getAttribute("cart" + cookie.getValue()); if (cart == null) { cart = new HashMap<Product, Integer>(); }
在购物车页面点击现在结账后,就会跳转到提交订单页面中了。
填写收货地址、收货人、电话等信息后,点击提交订单,就到了计算页面了,然后输入支付宝账号和密码后,商品购买流程就结束了。
在管理员页面如果填写的是管理员账号的话,就直接到管理员管理页面了,整图页面如下所示:
目前管理员功能有限,只有添加商品、查看所有商品、查看所有用户等功能,后续可以添加上去,这里对照着源码大致就明白了,就不具体说明了。
到此,整体项目流程已经梳理完毕,具体请点击web_bookstore查看源码。
参考连接
1、https://github.com/luoxn28
2、Java Web之会话技术
3、Java Web之Servlet技术