书接上回:
【MVC购物车】类关系

1 建表

DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (`id` int(11) DEFAULT NULL,`name` varchar(50) DEFAULT NULL,`price` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2 创建Product实体类

Product.java

package bean;
public class Product {private int id;private String name;private float price;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}
}

3 准备ProductDAO类

ProductDAO.java
这里写了两个方法:

  • 一个是获取所有产品的集合;
  • 一个是获取特定id的产品。
package dao;
import bean.Product;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class ProductDAO {public List<Product> ListProduct() throws ClassNotFoundException, SQLException {List<Product> products = new ArrayList<>();Class.forName("com.mysql.jdbc.Driver");Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8", "root", "admin");String sql = "select * from product order by id desc";PreparedStatement ps = c.prepareStatement(sql);ResultSet rs = ps.executeQuery();while (rs.next()) {Product product = new Product();product.setId(rs.getInt(1));product.setName(rs.getString(2));product.setPrice(rs.getFloat(3));products.add(product);}ps.close();c.close();return products;}public Product getProduct(int id) throws ClassNotFoundException, SQLException {// 需要进行非空判读时,实例化要分开写Product product = null;Class.forName("com.mysql.jdbc.Driver");Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8", "root", "admin");String sql = "select * from product where id = ?";PreparedStatement ps = c.prepareStatement(sql);ps.setInt(1, id);ResultSet rs = ps.executeQuery();if (rs.next()) {product = new Product();product.setId(id);product.setName(rs.getString(2));product.setPrice(rs.getFloat(3));}ps.close();c.close();return product;}
}

4 准备ProductListServlet类

ProductListServlet.java

  • 这里将products集合放入了request请求中,所以需要服务端跳转
public class ProductListServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {List<Product> products = new ProductDAO().ListProduct();request.setAttribute("products", products);request.getRequestDispatcher("listProduct.jsp").forward(request, response);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}}
}

5 准备listProduct页面

listProduct.jsp

  • 点击购买会跳转至addOrderItem的url路径下的相应界面;
  • 点击加入购物车,会通过异步的方式,将所选商品信息和数量信息添加至购物车,即addOrderItem路径,本页面并不会跳转
  • 点击查看购物车,直接跳转至listOrderItem路径下的订单项信息。
<%@ page language="java" isELIgnored="false" import="java.util.*" contentType="text/html; UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><script src="js/jquery.min.js"></script>
<script>$(function () {$("input.addCartButton").removeAttr("disabled");$("input.addCartButton").click(function () {$(this).attr("disabled", "disabled");var button = $(this);var pid = $(this).attr("pid");var number = $("input.number[pid=" + pid + "]").val();var page = "addOrderItem";$.get(page,{"num": number, "pid": pid},function (result) {$("#addCartSuccessMessage").fadeIn(1200);$("#addCartSuccessMessage").fadeOut(1200, function () {button.removeAttr("disabled");});});});$("#addCartSuccessMessage").hide();});
</script><%--如果用户登录,就显示用户名--%>
<c:if test="${!empty user}"><div align="center">当前用户:${user.name}</div>
</c:if><table align='center' border='1' cellspacing='0'><tr><td>id</td><td>名称</td><td>价格</td><td align="center">购买</td></tr><c:forEach items="${products}" var="product"><tr><td>${product.id}</td><td>${product.name}</td><td>${product.price}</td><td><form action="addOrderItem" method="post">数量<input pid="${product.id}" class="number" type="text" value="1" name="num"><input type="hidden" name="pid" value="${product.id}"><input type="submit" value="购买"></form><input class="addCartButton" pid="${product.id}" type="submit" value="加入购物车"></td></tr></c:forEach><tr><td colspan="4"><a href="listOrderItem">查看购物车</a></td></tr>
</table>

6 准备OrderItem实体类

OrderItem.java
不到生成订单这一步,就不用新建数据库表,所有信息都存在session中。

public class OrderItem {private int id;private Product product;private int num;private Order order;public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}public int getId() {return id;}public void setId(int id) {this.id = id;}public Product getProduct() {return product;}public void setProduct(Product product) {this.product = product;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}
}

7 准备OrderItemAddServlet类

OrderItemAddServlet.java

  • 首先,通过request获取从listProduct.jsp页面获取的产品id和数量;
  • 通过productDAO获取对应的产品对象;
  • 将将产品信息存入订单项对象中;
  • 将订单项对象存入集合,并将集合存入session中。
  • 操作完成后进行页面跳转listOrderItem
public class OrderItemAddServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int num = Integer.parseInt(request.getParameter("num"));int pid = Integer.parseInt(request.getParameter("pid"));try {Product product = new ProductDAO().getProduct(pid);OrderItem oi = new OrderItem();oi.setNum(num);oi.setProduct(product);List<OrderItem> ois = (List<OrderItem>) request.getSession().getAttribute("ois");if (ois == null) {ois = new ArrayList<>();request.getSession().setAttribute("ois", ois);}// 将重复的订单项合并,不能使用ois.contains(oi)判断oi是否在ois中。boolean found = false;for (OrderItem orderItem : ois) {if (orderItem.getProduct().getId() == oi.getProduct().getId()) {orderItem.setNum(orderItem.getNum() + oi.getNum());found = true;break;}}if (!found){ois.add(oi);}response.sendRedirect("listOrderItem");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}
}

8 准备listOrderItem页面

listOrderItem.jsp

  • 点击生成订单会跳转至createOrder,将订单信息存入数据库,否则订单信息只存在session中
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" import="java.util.*"language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--如果用户登录,就显示用户名--%>
<c:if test="${!empty user}"><div align="center">当前用户:${user.name}</div>
</c:if>
<table align='center' border='1' cellspacing='0'><tr><td>商品名称</td><td>单价</td><td>数量</td><td>小计</td></tr><c:forEach items="${ois}" var="oi"><tr><td>${oi.product.name}</td><td>${oi.product.price}</td><td>${oi.num}</td><td>${oi.product.price*oi.num}</td><td><a href="deleteOrderItem?pid=${oi.product.id}">删除订单项</a></td></tr></c:forEach><c:if test="${!empty ois}"><tr><td colspan="5" align="right"><a href="createOrder">生成订单</a></td></tr></c:if>
</table>

9 准备OrderItemDeleteServlet类

OrderItemDeleteServlet.java
既然有新增,自然有删除。

  • 从删除链接获取要删除的产品id;
  • 从session中获取订单项集合,遍历集合中的订单项,将对应产品id相等的订单项从集合中移除。
public class OrderItemDeleteServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int pid = Integer.parseInt(request.getParameter("pid"));try {Product product = new ProductDAO().getProduct(pid);List<OrderItem> ois = (List<OrderItem>) request.getSession().getAttribute("ois");List<OrderItem> ois4Delete = new ArrayList<>();if (ois != null) {for (OrderItem oi : ois) {if (oi.getProduct().getId() == pid) {ois4Delete.add(oi);}}}ois.removeAll(ois4Delete);response.sendRedirect("listOrderItem");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}
}

10 配置web.xml

 <servlet><servlet-name>ProductListServlet</servlet-name><servlet-class>servlet.ProductListServlet</servlet-class></servlet><servlet-mapping><servlet-name>ProductListServlet</servlet-name><url-pattern>/listProduct</url-pattern></servlet-mapping><servlet><servlet-name>OrderItemAddServlet</servlet-name><servlet-class>servlet.OrderItemAddServlet</servlet-class></servlet><servlet-mapping><servlet-name>OrderItemAddServlet</servlet-name><url-pattern>/addOrderItem</url-pattern></servlet-mapping><servlet><servlet-name>OrderItemListServlet</servlet-name><servlet-class>servlet.OrderItemListServlet</servlet-class></servlet><servlet-mapping><servlet-name>OrderItemListServlet</servlet-name><url-pattern>/listOrderItem</url-pattern></servlet-mapping><servlet><servlet-name>OrderItemDeleteServlet</servlet-name><servlet-class>servlet.OrderItemDeleteServlet</servlet-class></servlet><servlet-mapping><servlet-name>OrderItemDeleteServlet</servlet-name><url-pattern>/deleteOrderItem</url-pattern></servlet-mapping>

11 运行

  • 选择数量后,点击加入购物车或者购买,即可都添加至购物车中。
  • 加入购物车是用异步的方式实现的,不会发生页面跳转
  • 购买是直接跳转

    随后可以看到订单项页面:

参考资料
https://how2j.cn/k/cart/cart-product/596.html?p=151390

【MVC购物车】购买和加入购物车功能相关推荐

  1. 【分析】立即购买vs加入购物车,移动电商购买流程差异分析

    在使用各大电商APP时,有没有发现在购买流程中,有的APP提供了"立即购买"和"加入购物车"的功能,而有的APP只有"加入购物车",这是为什 ...

  2. java web购物车_java web开发——购物车功能实现

    之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: 2.用session实现购物车: 3 ...

  3. ectouch购物车添加勾选结算功能

    购物车勾选结算功能 开发使用的是ectouch企业版,带有购物车功能. 当前功能:在商品详情页面,点击添加购物车后,会进入购物车中.在购物车页面,点击'立即购买'会将购物车中的全部商品都结算生成订单. ...

  4. java购物车后台_java开发——购物车功能如何实现

    java web开发_购物车功能实现 之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: ...

  5. 云炬Android开发笔记 13购物车,订单,支付功能开发(包含支付宝支付和微信支付)

    阅读目录 1.购物车UI编写 1.1 购物车布局  1.2 recycleView中的item的布局 2. 购物车数据结构分析.解析与转化 2.1 解析的数据 2.2 数据的转化 2.3 数据适配器的 ...

  6. 瑞吉外卖(27)-查看购物车信息、清空购物车功能开发

    文章目录 代码开发 查看购物车信息 修改前端请求 编写ShoppingCartController.java 注意createtime字段 功能测试 清空购物车 自己的思路与代码 分析前端请求 Sho ...

  7. Android购物车存储,Android app购物车功能实现

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? UI效果图如下: 实现购物车功能的要点:购物车UI的布局 购物车里面商品数量是保存在本地数据库sqlite,要保证UI上 ...

  8. 购物车+购买样例 springmvc

    主要思路是点击加入购物车 在session创建购物车,加入product,num,和total 在购物车页面显示这些信息 并建立input value为 productid和num 列表 最后将这两个 ...

  9. android 飞入购物车,jQuery实现飞入购物车功能

    思路:点击商品,图片就会飞入购物车,不但变小,而且加入到购物车后消失 了,不但如此,商品的图片还在,所以我们使用克隆的方法,加入到购物车后清除购物车即可,然后购物车+1 首先获取商品图片的位置及大小, ...

最新文章

  1. vs转eclipse之工具快速上手篇
  2. 算法笔记-两数之和、三数之和、四数之和(LeetCode)
  3. CDH6.3.2添加Hue服务时,验证数据库连接报错 Unexpected error. Unable to verify database connection.
  4. Mahout实战---运行第一个推荐引擎
  5. linux中字体的安装以及Terminal字体重叠问题解决
  6. python开发直播网站_开发直播网站源码的三种计算机语言
  7. SAPI使用总结——SpVoice的使用方法
  8. Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
  9. 前端模板技术的全面总结
  10. Tomcat 8 中的startup.bat
  11. Retrofit的简单封装
  12. 1486mysql,mysql_error.md
  13. php实现微信小程序人脸识别登录
  14. Pythonz之路,Day1 基于Python3 转自金角大王
  15. GStreamer开发介绍
  16. Android之如何分析手机系统相册图片和视频删除后保存的位置
  17. Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略
  18. 尚硅谷-互联网大厂高频重点面试题 (第2季)JUC多线程及高并发
  19. 零基础语法入门第十二/十三讲指示代词和不定代词以及形容词
  20. linux命令eric,linux命令杂记 - erichd的个人页面 - OSCHINA - 中文开源技术交流社区

热门文章

  1. 神州数码交换机等设备如何与CRT连接
  2. 网站建站有多少种类型?需要源代码吗?
  3. 基于MeshCNN和PyTorch的三维对象分类和分割
  4. MVC Model验证总结 @Html.ValidationSummary(true)
  5. 统计数据集的标准差和方差
  6. Google IaaS云平台GCE正式发布
  7. Knights in Chessboard (找规律)
  8. mysql:安装版(解压版)MySQL下载、配置、安装以及解决MySQL服务无法启动问题
  9. 前端自动化构建工具合集之webpack-姜威-专题视频课程
  10. 安卓出现闪退是什么情况