JSP购物车案例精简版-适合小白学习

Posted 花伤情犹在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP购物车案例精简版-适合小白学习相关的知识,希望对你有一定的参考价值。

前言

购物车是电商网站必不可少的功能,没有它我们的购物将变得繁琐,如同你去超市买东西,没有购物车的话你你买东西的数量将受到限制,因为当你要买的东西越来越多的时候,你根本拿不下所有的对象。想象一下如果你去京东、淘宝上买东西,没有购物车的话你就一次性只能买一件商品,没有结算功能。本文讲解一下简单的购物车原理,适合小白学习。

效果

在这里插入图片描述

案例打包下载


构建环境

导包
在这里插入图片描述
搭建项目目录
在这里插入图片描述

设计实体

书籍实体

package entity;

/**
 * 书籍实体类
 */
public class Book {
    //书籍id
    private String id;
    //书籍名称
    private String name;
    //书籍作者
    private String author;
    //书籍描述
    private String description;
    //书籍价格
    private double price;

    public Book(){

    }

    public Book(String id, String name, String author, String description, double price) {
        this.id = id;
        this.name = name;
        this.author = author;
        this.description = description;
        this.price = price;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", author='" + author + '\\'' +
                ", description='" + description + '\\'' +
                ", price='" + price + '\\'' +
                '}';
    }
}

购物车与购物项实体

可能我们会这样设计购物车

/*该类代表的是购物车*/
    public class Cart {
    
        //关键字是书籍的id,值是书
        private Map<String, Book> bookMap = new LinkedHashMap<>();
    
    
    }

上面的做法是不合适的,试想一下:如果我要购买两本相同的书,购物车的页面上就出现了两本书,而不是书x2。买三本相同的书就在购物页面上出现三本书,而不是书x3.

因此,Map集合的值不能是Book对象,那我们怎么才能解决上面所说的问题呢?我们最常用的就是,再写一个实体CartItem(代表购物项)

购物项实体

package entity;

import javax.xml.namespace.QName;

/**
 * 购物项实体
 *
 * 购物项代表的是当前的书,并表示该书的数量以及总价格
 * 注意:书籍的总价格:数量*单价-->所以要重写getQuantity()
 */
public class CartItem {
    //当前的书籍
    private Book book;
    //该书的数量
    private int quantity;
    //购物项的总价格(数量*单价)
    private double price;

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double getPrice() {
        //获取该书的单价
        double unitprice = book.getPrice();
        //总价:数量*单价
        double totalprice = unitprice*this.quantity;
        //返回购物项的总价格
        return totalprice;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

购物车实体

package entity;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 购物车实体
 */
public class Cart {
    //键是书籍的id,值是书
    private Map<String,CartItem> bookmap = new LinkedHashMap<>();
    //购物车总价
    private double price;

    //把购物项(用户传递进来的书籍)添加到购物车里面去
    public void addBook(Book book){
        //获取得到的购物项
        CartItem cartItem = bookmap.get(book.getId());
        //判断购物车是否存在购物项,如果不存在
        if (cartItem==null){
            //创建这个购物对象
            cartItem = new CartItem();
            //将用户传递过来的书籍作为购物项
            cartItem.setBook(book);
            //默认把该书籍的数量设置为1
            cartItem.setQuantity(1);
            //把购物项添加到购物车去
            bookmap.put(book.getId(),cartItem);
        }else {
            //如果购物项存在,将购物项的数量+1
            cartItem.setQuantity(cartItem.getQuantity()+1);
        }
    }

    public Map<String, CartItem> getBookmap() {
        return bookmap;
    }

    public void setBookmap(Map<String, CartItem> bookmap) {
        this.bookmap = bookmap;
    }

    /**
     * //购物车的总价格就是所有的购物项价格加起来
     * @return
     */
    public double getPrice() {
        //默认购物车总价格为 0
        double totalprice = 0;
        //对bookmap进行遍历
        for (Map.Entry<String, CartItem> me : bookmap.entrySet()) {
            //得到每个购物项
            CartItem cartItem = me.getValue();
            //将每个购物项的钱加起来,就是购物车的总价了
            totalprice+=cartItem.getPrice();
        }
        return totalprice;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

数据库设计

数据库这里为了方便就用Map集合代替,关键是要懂原理

package dao;

import entity.Book;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 用集合模拟数据库
 */
public class bookDB {
    //既然是购物车案例,应该会有增删的操作,通过关键字查询书籍,所以使用LinkedHashMap集合
    private static Map<String, Book> map = new LinkedHashMap<>();

    static {
        map.put("1",new Book("1", "java", "zhongfucheng", "好书", 99));
        map.put("2",new Book("2", "javaweb", "ouzicheng", "不好的书", 44));
        map.put("3",new Book("3", "ajax", "xiaoming", "一般般", 66));
        map.put("4",new Book("4", "spring", "xiaohong", "还行", 77));
        map.put("5",new Book("5", "Java入门到入土", "LCZ", "veryGood!", 99999));
    }

    //返回map集合
    public static Map<String, Book> getAll() {
        return map;
    }
}

开发DAO

dao层应该至少提供获取所有的书籍和根据关键字获取得到书籍

package dao;

import entity.Book;

import java.util.Map;

/**
 * 获取所有的书籍和根据关键字获取得到书籍
 */
public class bookDao {
    //获取存放着书籍的Map集合
    public Map getAll() {
        return bookDB.getAll();
    }

    //根据关键字获取某本书籍
    public Book find(String id) {
        return bookDB.getAll().get(id);
    }
}

开发service

service层就是对DAO层的一个封装

这里也为了方便就将所有功能写到一个类中

package service;

import dao.bookDao;
import entity.Book;
import entity.Cart;

import java.util.Map;

/**
 * 业务层(对dao层的封装)
 */
public class BusinessService {
    //实例化dao
    bookDao bookDao = new bookDao();
    /*列出所有的书*/
    public Map getAll() {
        return bookDao.getAll();
    }
    /*根据书的id获取书*/
    public Book findBook(String id) {
        return bookDao.find(id);
    }

    /*
     * 在购买书籍的时候,我们发现需要将书籍添加到购物车上
     * 如果我们直接在Servlet上使用Cart实体对象的addBook()和BookDao对象的find()方法,是可以完成功能的
     *
     * 但是,这样web层的程序就跟Dao层的耦合了,为了代码性的健壮性和解耦,我们在BusinessService中对他俩进行封装
     *
     * 于是有了buyBook()这个方法!
     * */

    /*把用户想买的书籍添加到当前用户的购物车上*/
    public void buyBook(String id, Cart cart) {
        //调用dao层返回一个图书对象
        Book book = bookDao.find(id);
        //将图书添加到购物车
        cart.addBook(book);
    }

    /**
     * 删除购物项
     * 用户要在购物车中删除某个购物项
     * @param id
     * @param cart
     */
    public void deleteBook(String id, Cart cart)  {
        //把购物项移除出去集合就行了!
        cart.getBookmap().remove(id);
    }

    //购物项数量增删
    public void updateNums(String id,Cart cart,String symbol){
        if ("add".equals(symbol)){//添加
            cart.getBookmap().get(id).setQuantity(cart.getBookmap().get(id).getQuantity()+1);
        }else if ("subtract".equals(symbol)){//删除
            if (cart.getBookmap().get(id).getQuantity()-1==0){//如果删除后数量为---0
                deleteBook(id,cart);//删除购物项
            }else {
                cart.getBookmap().get(id).setQuantity(cart.getBookmap().get(id).getQuantity()-1);
            }
        }
    }

    /**
     * 修改物品的数量
     * @param id 要修改的物品id
     * @param cart  用户的购物车
     * @param quantity  用户修改的数量
     */
    public void updateQuantity(String id, Cart cart, String quantity) {
        //通过书的id获取得到购物车的购物项,再修改购物项的数量即可!(因为书的id和获取购物项的关键字是一致的!)
        cart.getBookmap().get(id).setQuantity(Integer.parseInt(quantity));
    }

    /**
     * 清空购物车
     * @param cart
     */
    public void clearCart(Cart cart){
        //获取到购物车的购物项---》删除全部
        cart.getBookmap().clear();
    }

}

开发web

列出所有的书Servlet

package servlet;

import service.BusinessService;

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 java.io.IOException;
import java.util.Map;

/**
 * 列出所有商品
 */
@WebServlet("/listBooks")
public class listBooks extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用service层的方法,获取得到存放书籍的Map集合
        BusinessService businessService = new BusinessService();
        Map books = businessService.getAll();

        //存放在request域对象中,交给jsp页面显示
        request.setAttribute("books", books);

        //跳转到jsp页面中
        request.getRequestDispatcher("listBook.jsp").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

列出所有书的JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>显示所有的书籍</title>
</head>
<script src="js/jquery-3.6.0.js"></script>
<body>
<style>
    table{
        text-align: center;
        margin: auto;
    }
</style>
<%--Servlet传递过来的是一个Map对象,要显示所有的书籍,就需要遍历Map集合(EL表达式和JSTL标签合用)--%>
<table border="1px">
    <tr>
        <td>搜索图书</td>
        <td colspan="4"><input type="text" style="width: 100%;" placeholder="请输入ID" id="queryid"></td>
        <td><button style="width: 100%" id="query">搜索</button></td>
    </tr>
    <tr>
        <th>书籍编号</th>
        <th>名称</th>
        <th>作者</th>
        <th>详细信息</th>
        <th>价格</th>
        <th>添加到购物车</th>
    </tr>
    <%--如果根据id查到数据 find==ok --%>
    <c:if test="${find=='ok'}">
            <tr>
                <td>${book.id}</td>
                <td>${book.name}</td>
                <td>${book.author}</td>
                <td>${book.description}</td>
                <td>${book.price}</td>
                <td><a href="buyBooks?bookid=${book.id}">添加</a></td>
            </tr>
    </c:if>
<%--所有数据--%>
    <c:if test="${not empty books}">
        <c:forEach items=以上是关于JSP购物车案例精简版-适合小白学习的主要内容,如果未能解决你的问题,请参考以下文章

python二级练习和考试复习(购物卡案例)

案例29-购物车提交订单

Session案例:简易的购物车

python小白学习记录 多线程爬取ts片段

为学弟学妹整理的学生成绩管理系统案例,适合小白

干货 | 适合小白的Python学习路径攻略!