商城购物车的实现方式
Session实现
购物车实体类
CartItem.java
package entity;
public class CartItem {
//数量
private int count;
//类别
private Book book;
@Override
public String toString() {
return "CartItem{" +
"count=" + count +
", book=" + book +
'}';
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
}
在book详情页面
book.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>book</title>
</script>
</head>
<body>
<form method="post" action="CartServlet?op=addItem">
<input type="hidden" name="bid" value="${book.id}">
id:<input type="text" name="id" value="${book.id}" readonly="readonly"></p>
图书图片: <img src="${book.img_Path}" width="100px" height="100px"></p>
name:<input type="text" name="name" value="${book.name}"></p>
price:<input type="text" name="price" value="${book.price}"></p>
author:<input type="text" name="author" value="${book.author}"></p>
sales:<input type="text" name="sales" value="${book.sales}"></p>
stock:<input type="text" name="stock" value="${book.stock}"></p>
<input type="submit" value="加入购物车"></p>
</form>
</body>
</html>
CartServlet.java
import entity.Book;
import entity.CartItem;
import service.IBookService;
import service.impl.IBookServiceImpl;
import utlis.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@WebServlet(name = "CartServlet", value = "/CartServlet")
public class CartServlet extends BaseServlet {
private IBookService ibs = new IBookServiceImpl();
HashMap<Integer, CartItem> cart = new HashMap<>();
protected void addItem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 接收问号传参传递过来的bid
int bid = Integer.parseInt(request.getParameter("bid"));
// 借助service,dao与数据库交互得到bid对应的Book对象
Book b = ibs.getById(bid);
//System.out.println(bid);
// servlet中需要使用request对象的getSession()方法拿到HttpSession对象
HttpSession session = request.getSession();
// 在session中获取”购物车“对象
Object cartObj = session.getAttribute("cart");
// 第一次或者之前没有作任何购物车添加时,购物车为空
if(cartObj == null){
// 创建购物车对象
// HashMap<Integer, CartItem> cart = new HashMap<>();
// 创建购物车条目对象
CartItem ci= new CartItem();
// 分别设置购物车条目的book属性和count属性
ci.setBook(b);
ci.setCount(1);
// 将购物车条目添加到购物车集合
cart.put(bid, ci);
// 将购物车存放在session中
session.setAttribute("cart", cart);
}else{ // session中已经存在购物车对象
// 将购物车对象强转回为Map对象
Map<Integer, CartItem> cart = (Map<Integer, CartItem>) cartObj;
CartItem ci = null;
// 如果购物车中含有要添加的书籍编号
if (cart.containsKey(bid)) {
ci = cart.get(bid);
// 只需要进行数量的更新
ci.setCount(ci.getCount() + 1);
}else{
// 购物车中不含有要添加的书籍编号
// 则创建购物车条目对象
ci = new CartItem();
// 分别设置购物车条目中的书籍对象和数量值
ci.setBook(b);
ci.setCount(1);
}
// 将购物车条目对象添加到购物车集合中
cart.put(bid, ci);
// 再将购物车对象放入session中
session.setAttribute("cart", cart);
}
// 请求转发到购物车详情页面
request.getRequestDispatcher("/pages/cart/cart.jsp").forward(request, response);
}
protected void deleteItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
// 获取商品编号
int id = WebUtils.parseInt(req.getParameter("bid"), 0);
// 获取购物车对象
// Cart cart = (Cart) req.getSession().getAttribute("cart");
cart = (HashMap<Integer, CartItem>) req.getSession().getAttribute("cart");
if (cart != null) {
// // 删除 了购物车商品项
cart.remove(id);
// // 重定向回原来购物车展示页面
// resp.sendRedirect(req.getHeader("Referer"));
req.getRequestDispatcher("/pages/cart/cart.jsp").forward(req, resp);
}
}
//清空购物车
protected void clearItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
// 获取商品编号
// int id = WebUtils.parseInt(req.getParameter("bid"), 0);
// 获取购物车对象
cart = (HashMap<Integer, CartItem>) req.getSession().getAttribute("cart");
if (cart != null) {
// // 删除 了购物车商品项
cart.clear();
// // 重定向回原来购物车展示页面
// resp.sendRedirect(req.getHeader("Referer"));
req.getRequestDispatcher("/pages/cart/cart.jsp").forward(req, resp);
}
}
}
数据库实现
DROP TABLE IF EXISTS t_cart;
CREATE TABLE t_cart(
id INT NOT NULL AUTO_INCREMENT COMMENT '购物车id' ,
count INT NOT NULL COMMENT '购物车商品数量' ,
uid INT NOT NULL COMMENT '用户id' ,
bid INT NOT NULL COMMENT '商品id' ,
PRIMARY KEY (id),
foreign key (uid) references t_user(id),
foreign key (bid) references t_book(id)
) COMMENT = '购物车';
Cart实体类
package entity;
public class Cart {
private Integer id;
private Integer count;
private Integer uid;
private Integer bid;
public Cart() {
}
public Cart(Integer id, Integer count, Integer uid, Integer bid) {
this.id = id;
this.count = count;
this.uid = uid;
this.bid = bid;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public Integer getBid() {
return bid;
}
public void setBid(Integer bid) {
this.bid = bid;
}
@Override
public String toString() {
return "Cart{" +
"id=" + id +
", count=" + count +
", uid=" + uid +
", bid=" + bid +
'}';
}
}
IcartDao.java
import entity.Cart;
import java.util.List;
public interface ICartDao {
//购物车的添加 修改 删除 查询
List<Cart> getAll();
//根据用户id查询 用户购买的商品
List<Cart> getAllByUid(int uid);
//修改 根据用户id和商品id修改商品数量
int update(int count,int uid,int bid);
//根据商品id和用户id 删除单个商品
int deleteByBid(int uid,int bid);
//删除(清空购物车) 根据用户id删除购物车
int deleteAll(int uid);
//添加购物车
int save(Cart cart);
//获取购物车中商品数量
long getCount();
}
ICartService.java
package service;
import entity.Cart;
import java.util.List;
public interface ICartService {
//购物车的添加 修改 删除 查询
List<Cart> getAll();
//根据用户id查询 用户购买的商品
List<Cart> getAllByUid(int uid);
//修改 根据用户id和商品id修改商品数量
boolean update(int count,int uid,int bid);
//根据商品id和用户id 删除单个商品
boolean deleteByBid(int uid,int bid);
//删除(清空购物车) 根据用户id删除购物车
boolean deleteAll(int uid);
//添加购物车
boolean save(Cart cart);
//获取购物车中商品数量
long getCount();
}
book.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>book</title>
<%@include file="/pages/common/head.jsp"%>
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
<form method="post" action="UserCartServlet?op=addItem">
<input type="hidden" name="bid" value="${book.id}">
id:<input type="text" name="id" value="${book.id}" readonly="readonly"></p>
图书图片: <img src="${book.img_Path}" width="100px" height="100px"></p>
name:<input type="text" name="name" value="${book.name}"></p>
price:<input type="text" name="price" value="${book.price}"></p>
author:<input type="text" name="author" value="${book.author}"></p>
sales:<input type="text" name="sales" value="${book.sales}"></p>
stock:<input type="text" name="stock" value="${book.stock}"></p>
<input type="submit" value="加入购物车"></p>
</form>
</body>
</html>
UserCartServlet.java
package controller;
import entity.Book;
import entity.Cart;
import entity.CartItem;
import entity.User;
import service.IBookService;
import service.ICartService;
import service.impl.IBookServiceImpl;
import service.impl.ICartServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.ws.Response;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@WebServlet(name = "UserCartServlet",value = "/UserCartServlet")
public class UserCartServlet extends BaseServlet {
private IBookService ibs = new IBookServiceImpl();
HashMap<Integer, CartItem> cart = new LinkedHashMap<>();
ICartService iCartService = new ICartServiceImpl();
protected void getCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取到页面存放在session的id 通过uid找到cart集合对象 然后将集合对象存放到map中
HttpSession session = request.getSession();
User user = (User) session.getAttribute("mgr");
int uid = user.getId();
//通过uid获取cart集合对象 这里的集合中Uid相同 bid不可能相同
List<Cart> allByUid = iCartService.getAllByUid(uid);
if (allByUid == null) {
request.getRequestDispatcher("/pages/cart/usercart.jsp").forward(request, response);
} else {
//集合不为空,则对集合进行遍历
for (Cart cart1 : allByUid) {
int bookid = cart1.getBid();
Book byId = ibs.getById(cart1.getBid());
int count = cart1.getCount();
//新创建一个cartItem
CartItem cartItem = new CartItem();
cartItem.setCount(count);
cartItem.setBook(byId);
//把购物车条目放进map中
cart.put(bookid, cartItem);
}
//把购物车保存在session域中
session.setAttribute("usercart", cart);
}
request.getRequestDispatcher("/pages/cart/usercart.jsp").forward(request, response);
}
protected void addItem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取到页面存放在session的id 通过uid找数据库中是否有cart对象
HttpSession session = request.getSession();
User user = (User) session.getAttribute("mgr");
int uid = user.getId();
//根据uid找到用户的购物车
List<Cart> allByUid = iCartService.getAllByUid(uid);
// 接收问号传参传递过来的bid
int bid = Integer.parseInt(request.getParameter("bid"));
// 如果购物车为空,添加商品到购物车
if (allByUid.size()==0) {
//将购物车存放到数据库中
Cart carts = new Cart(null, 1, uid, bid);
boolean save = iCartService.save(carts);
if(save){
request.getRequestDispatcher("client/bookServlet?op=pageByPrice").forward(request, response);
}
} else {
//allByUid集合不为空,则对集合进行遍历并对bid进行判断如果没有则添加如果bid重复对count进行修改
for (Cart cart1 : allByUid) {
//得到商品id
int bookid = cart1.getBid();
//获取数量
int count = cart1.getCount();
//如果集合中有重复的bid对count进行改变
if (cart.containsKey(bookid)) {
//对数据库中的cart进行更新
int newcount = count++;
boolean update = iCartService.update(newcount, uid, bid);
if(update){
request.getRequestDispatcher("UserCartServlet?op=getCart").forward(request, response);
}
}
Cart carts = new Cart(null, 1, uid, bid);
boolean save = iCartService.save(carts);
if (save){
request.getRequestDispatcher("UserCartServlet?op=getCart").forward(request, response);
}
}
}
//加入成功后跳转到加入成功页面 可使用ajax 或者 页面跳转两种方式
}
protected void deleteItem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据uid和bid删除单个商品
//获取到页面存放在session的id 通过uid找到cart集合对象 然后将集合对象存放到map中
HttpSession session = request.getSession();
User user = (User) session.getAttribute("mgr");
int uid = user.getId();
// 接收问号传参传递过来的bid
int bid = Integer.parseInt(request.getParameter("bid"));
boolean b = iCartService.deleteByBid(uid, bid);
if (b){
request.getRequestDispatcher("UserCartServlet?op=getCart").forward(request,response);
}
}
protected void deleteAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("mgr");
int uid = user.getId();
boolean b = iCartService.deleteAll(uid);
if (b){
response.sendRedirect("UserCartServlet?op=getCart");
}
}
}
usercart.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>cart</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<h1>this is cart page.</h1>
<c:if test="${usercart == null}">
空空如也
</c:if>
<c:if test="${usercart != null}">
<table class="table">
<c:forEach var="ci" items="${usercart}">
<tr>
<td>${ci.key}</td>
<td><img src="${ci.value.book.img_Path}" height="50px" width="50px"></td>
<td>${ci.value.book.name}</td>
<td>${ci.value.book.price}</td>
<td>${ci.value.book.author}</td>
<td>${ci.value.count}</td>
<td>${ci.value.book.price * ci.value.count}</td>
<td><a href="UserCartServlet?op=deleteItem&bid=${ci.key}">删除</a></td>
</tr>
</c:forEach>
<tr><a href="UserCartServlet?op=deleteAll">清空购物车</a></tr>
</table>
</c:if>
<tr><a href="#">结算</a></tr>
</body>
</html>
height="50px" width="50px"></td>
<td>${ci.value.book.name}</td>
<td>${ci.value.book.price}</td>
<td>${ci.value.book.author}</td>
<td>${ci.value.count}</td>
<td>${ci.value.book.price * ci.value.count}</td>
<td><a href="UserCartServlet?op=deleteItem&bid=${ci.key}">删除</a></td>
</tr>
</c:forEach>
<tr><a href="UserCartServlet?op=deleteAll">清空购物车</a></tr>
</table>
</c:if>
<tr><a href="#">结算</a></tr>
</body>
</html>