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购物车案例精简版-适合小白学习的主要内容,如果未能解决你的问题,请参考以下文章