使用Servlet结合JSP开发购物车功能。

1. 数据库关系

创建数据库cart,在cart下创建四个表。

这四个表的关系是:

order指该用户完成的一次订单,存储的是对应的用户信息(uid);而orderItem指的是订单中的每一条订单项,存储对应的订单id(oid),以及买的产品(pid)和购买数量。

表关系也比较好理解。

  • 一种产品可以对应多个订单项。
  • 多个订单项对应一个订单。
  • 多个订单对应一个用户。

2. 项目结构

这里指的是java代码目录下的包结构

- bean
- servlet
- dao
- util

其中bean包存放实体类,类属性为private,提供getter和setter,与数据库的记录形成一一对应(即数据库表的一条数据对应一个实体对象);

servlet包存放Servlet类,处理前端发来的请求,以及将响应发送回前端;

dao包存放与数据库相关操作的类,通过它对数据库进行CRUD;

util包存放工具类,我这里将加载数据库驱动和获取数据库连接封装到工具类DBUtil中,且使用静态方法和静态代码块,方便重复使用。

3. 项目逻辑

3.1 产品模块

效果:在浏览器中输入127.0.0.1/Cart/listProduct,网页会展示product表中的全部商品。

流程:

注意:

  1. MySQL的Maven依赖设置:
1
2
3
4
5
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
  1. Servlet的Maven依赖设置:
1
2
3
4
5
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
  1. JSP中使用了JSTL标准标签库,使用需要先在Maven中引入依赖:
1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

再在JSP文件头部写如下代码:

1
2
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false"%>

一定要把忽略EL表达式设置为False,否则不能使用${}直接获取值。

  1. 路径问题。重定向中”/“代表http://ip:port/,而转发中”/“代表http://ip:port/项目名称。我这里设置的基础路径是http://ip:port/Cart(项目名)。而不使用”/“则默认使用基础路径。所以这里转发中加不加”/“都可以;而重定向中要么使用”/Cart/映射”,要么就不加,直接使用映射。
    如果转发或重定向到JSP文件,可以加上JSP文件在web目录下的路径。例如我的listProduct.jsp放在webapp/list目录下,那么我的转发代码可以是:
1
request.getRequestDispatcher("/list/listProduct.jsp").forward(request, response);

3.2 用户模块

效果:在登录页面输入账户密码,如果正确(和数据库user表中的数据吻合),则显示产品页面。

流程:

3.3 订单项模块

效果:在产品页面点击购买,再点击显示购物车,可以显示刚才想要购买的物品。

流程:

3.4 订单模块

效果:点击生成订单,显示订单的每一条订单项,并将订单项存入数据库。

流程:

4. 源码

源码我放在GitHub上啦,需要的小伙伴可以自行克隆😀

5. 参考

感谢How2J的教程~😋