商城购物车的实现方式

商城购物车的实现方式

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值