JSP购物车案例精简版-适合小白学习
前言购物车是电商网站必不可少的功能,没有它我们的购物将变得繁琐,如同你去超市买东西,没有购物车的话你你买东西的数量将受到限制,因为当你要买的东西越来越多的时候,你根本拿不下所有的对象。想象一下如果你去京东、淘宝上买东西,没有购物车的话你就一次性只能买一件商品,没有结算功能。本文讲解一下简单的购物车原理,适合小白学习。效果构建环境导包搭建项目目录设计实体书籍实体package entity;/***
前言
购物车是电商网站必不可少的功能,没有它我们的购物将变得繁琐,如同你去超市买东西,没有购物车的话你你买东西的数量将受到限制,因为当你要买的东西越来越多的时候,你根本拿不下所有的对象。想象一下如果你去京东、淘宝上买东西,没有购物车的话你就一次性只能买一件商品,没有结算功能。本文讲解一下简单的购物车原理,适合小白学习。
效果
构建环境
导包
搭建项目目录
设计实体
书籍实体
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="${books}" var="me">
<tr>
<td>${me.key}</td>
<td>${me.value.name}</td>
<td>${me.value.author}</td>
<td>${me.value.description}</td>
<td>${me.value.price}</td>
<td><a href="buyBooks?bookid=${me.key}">添加</a></td>
</tr>
</c:forEach>
</c:if>
<%-- 如果没有查到数据 find==no --%>
<c:if test="${find=='no'}">
<tr>
<td colspan="6" style="text-align: center">无搜索结果</td>
</tr>
</c:if>
</table>
<script src="js/jquery-3.6.0.js"></script>
<script>
$(function () {
/**
* 根据id搜索
*/
//选中搜索按钮绑定单击事件
$("#query").click(function () {
//访问servlet的查询程序的url且带上参数id
window.location.href="queryBook?bookid="+$("#queryid").val();
})
})
</script>
</body>
</html>
购买操作
购物车的案例肯定要有购买操作,So接下来就是添加购买功能
添加购买的Servlet
package servlet;
import entity.Cart;
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;
/**
* 购买物品
*/
@WebServlet("/buyBooks")
public class buyBooks extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取得到传递过来的id
String id = request.getParameter("bookid");
//把用户想要买的书放到购物车上
//用户不单单只有一个,要让购物车上只为当前的用户服务,就需要用到会话跟踪技术了
Cart cart = (Cart) request.getSession().getAttribute("cart");
//如果当前用户还没有点击过购买的商品,那么是用户的购物车是空的
if (cart == null) {
cart = new Cart();
request.getSession().setAttribute("cart", cart);
}
//调用BussinessService的方法,实现购买功能!
BusinessService businessService = new BusinessService();
businessService.buyBook(id, cart);
//跳转到购物车显示的页面上
request.getRequestDispatcher("listCart.jsp").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
购物车页面
将添加到购物车的商品显示出来
<%@ 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>
<style>
h1,table{
text-align: center;
margin: auto;
}
a{
display: block;
text-align: center;
margin: auto;
}
</style>
<body>
<h1>购物车显示页面</h1>
<%--empty函数是判断集合中有没有元素--%>
<%--如果购物车是没有任何购物项的--%>
<c:if test="${empty(cart.bookmap)}">
<h1>您还没有购买过任何的书籍呀!</h1>
<a href="listBooks">回到主页</a>
</c:if>
<%--如果购物车有购物项,就应该把购物项的信息显示给用户--%>
<c:if test="${!empty(cart.bookmap)}">
<table border="1px">
<tr>
<td>书籍编号</td>
<td>名称</td>
<td>数量</td>
<td>小计</td>
<td>操作</td>
</tr>
<c:forEach items="${cart.bookmap}" var="me">
<tr>
<td>${me.key}</td>
<td>${me.value.book.name}</td>
<td><input type="button" value="-" id="${me.key}" onclick="updateNums(this)"><input style="text-align: center" class="numbers" type="text" name="quantity" value="${me.value.quantity}" oldVlue="${me.value.quantity}" id="${me.key}" onblur="update(this.value,this.id,this.oldValue)"><input
type="button" value="+" id="${me.key}" onclick="updateNums(this)"></td>
<td>${me.value.price}</td>
<td><a href="deleteCartBook?bookid=${me.key}">删除</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="2">
<a href="clearCart" onclick=" return clearCart()" >清空购物车</a>
</td>
<td colspan="2">合计:</td>
<td>${cart.price}</td>
</tr>
<tr>
<td colspan="5"><a href="index.jsp" style="text-align: center">继续购物</a></td>
</tr>
</table>
</c:if>
</table>
<script src="js/jquery-3.6.0.js"></script>
<script type="text/javascript">
/*
* @input 将输入框本身填入(这样可以获取得到输入框的值)
* @id 将书本的id传递进来,告诉服务器是修改哪一个购物项(书)
* @oldValue 原本的值,如果用户不想修改了,就修改为原本的值(下面会询问用户是否确定修改)
* */
/*
* @input 将输入框本身填入(这样可以获取得到输入框的值)
* @id 将书本的id传递进来,告诉服务器是修改哪一个购物项(书)
* @oldValue 原本的值,如果用户不想修改了,就修改为原本的值(下面会询问用户是否确定修改)
* */
function update(value,id,oldValue) {
//获取得到输入框的数据
var quantity = value;
//询问用户是否真的修改
var b = window.confirm("你确定修改吗?");
//如果确定修改,就跳转到修改的Servlet上
if(b) {
window.location.href = "${pageContext.request.contextPath}/updateQuantity?bookid=" + id + "&quantity=" + quantity + "";
}else {
//如果不确定修改,把输入框的数据改成是原来的
input.value = oldValue;
}
}
/**
* object代表增加或删少的按钮
* symbol代表符号要么是减号“ - ”要么是加号" + "
* @param object
*/
function updateNums(object) {
var symbol= object.value;
if (symbol=="+"){
window.location.href="updateNums?bookid="+object.id+"&symbol=add";
}else if (symbol=="-"){
window.location.href="updateNums?bookid="+object.id+"&symbol=subtract";
}
}
/**
* 清空购物车
* 弹窗调试---》确定则返回true 取消则返回false
* @returns {boolean}
*/
function clearCart() {
var b = window.confirm("你确定要清空购物车吗?");
//如果用户确定,就跳转到相对应的Servlet上
if(b) {
return true;
}else {
return false;
}
}
</script>
</body>
</html>
删除购物车商品
将添加到购物车的商品进行删除
如果想要删除购物车中的商品,定义一个超链接,超链接指向deleteCartServlet,将想要删除的书本的id以参数的形式带过去(如果不将id带过去,服务器哪知道你要删除的是哪个)
开发删除商品的deleteCartBook
package servlet;
import entity.Cart;
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;
/**
*根据id删除商品
*/
@WebServlet("/deleteCartBook")
public class deleteCartBook extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取得到用户想要删除哪个书本的id
String id = request.getParameter("bookid");
//获取该用户相对应的购物车对象
Cart cart = (Cart) request.getSession().getAttribute("cart");
try {
//删除购物车的商品,也应该是在BusinessService中有的功能,于是乎又回到BusinessService中写代码
BusinessService businessService = new BusinessService();
businessService.deleteBook(id, cart);
//删除购物车的商品后,也应该直接跳转回去购物车的显示页面中
request.getRequestDispatcher("listCart.jsp").forward(request, response);
} catch (Exception e) {
request.setAttribute("message", "购物车空了!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
多本一起购买
比如我想购买Java这本书买50本,100本,难道我要傻傻的重复添加100次嘛?所以我们要加一个多本一起购买的功能,说白了就是商品数量的自定义
。
**在购物车上,数量的值改成是输入框,同时在左右两边加上+1和-1的操作
**
<td><input type="button" value="-" id="${me.key}" onclick="updateNums(this)"><input style="text-align: center" class="numbers" type="text" name="quantity" value="${me.value.quantity}" oldVlue="${me.value.quantity}" id="${me.key}" onblur="update(this.value,this.id,this.oldValue)"><input type="button" value="+" id="${me.key}" onclick="updateNums(this)"></td>
现在我们可以自定义商品数量,同时还可以微调数量加1和减1
之后还要给它们绑定JavaScript进行数据提交
我们写javascript的代码,输入框的焦点时区,就响应事件,将变动的数据传递给服务器,实现数据更新!
/*
* @input 将输入框本身填入(这样可以获取得到输入框的值)
* @id 将书本的id传递进来,告诉服务器是修改哪一个购物项(书)
* @oldValue 原本的值,如果用户不想修改了,就修改为原本的值(下面会询问用户是否确定修改)
* */
/*
* @input 将输入框本身填入(这样可以获取得到输入框的值)
* @id 将书本的id传递进来,告诉服务器是修改哪一个购物项(书)
* @oldValue 原本的值,如果用户不想修改了,就修改为原本的值(下面会询问用户是否确定修改)
* */
function update(value,id,oldValue) {
//获取得到输入框的数据
var quantity = value;
//询问用户是否真的修改
var b = window.confirm("你确定修改吗?");
//如果确定修改,就跳转到修改的Servlet上
if(b) {
window.location.href = "${pageContext.request.contextPath}/updateQuantity?bookid=" + id + "&quantity=" + quantity + "";
}else {
//如果不确定修改,把输入框的数据改成是原来的
input.value = oldValue;
}
}
编写更改商品数量updateQuantity的Servlet
自定义商品数量
package servlet;
import entity.Cart;
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;
/**
* 商品数量的增删
*/
@WebServlet("/updateNums")
public class updateNums extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取这本书的id
String id = request.getParameter("bookid");
System.out.println(id);
//获取符号( add(+)或 subtract(-) )
String symbol = request.getParameter("symbol");
//获取购物车
Cart cart =(Cart) request.getSession().getAttribute("cart");
//实例化业务层的
BusinessService businessService = new BusinessService();
//调用业务层的自定义商品数量的方法
businessService.updateNums(id,cart,symbol);
//重定向到显示页面(防止刷新造成数据重复提交)
response.sendRedirect("listCart.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
给减号-和加号+绑定Js函数
/**
* 清空购物车
* 弹窗调试---》确定则返回true 取消则返回false
* @returns {boolean}
*/
function clearCart() {
var b = window.confirm("你确定要清空购物车吗?");
//如果用户确定,就跳转到相对应的Servlet上
if(b) {
return true;
}else {
return false;
}
}
编写微调商品数量UpdateNums的Servlet
实现商品数量的+1和-1
package servlet;
import entity.Cart;
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;
/**
* 商品数量的增删
*/
@WebServlet("/updateNums")
public class updateNums extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取这本书的id
String id = request.getParameter("bookid");
System.out.println(id);
//获取符号( add(+)或 subtract(-) )
String symbol = request.getParameter("symbol");
//获取购物车
Cart cart =(Cart) request.getSession().getAttribute("cart");
//实例化业务层的
BusinessService businessService = new BusinessService();
//调用业务层的自定义商品数量的方法
businessService.updateNums(id,cart,symbol);
//重定向到显示页面(防止刷新造成数据重复提交)
response.sendRedirect("listCart.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
清空购物车
清空购物车就是清空Map集合
package servlet;
import entity.Cart;
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;
/**
* 清空购物车
*/
@WebServlet("/clearCart")
public class clearCart extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到用户相对应的购物车
Cart cart = (Cart) request.getSession().getAttribute("cart");
//调用相对应BusinessService的方法
BusinessService businessService = new BusinessService();
try {
//清空购物车【实际上就是清空购物车的Map集合中的元素】
businessService.clearCart(cart);
//返回给购物车显示页面
request.getRequestDispatcher("listCart.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
在清空购物车的连接上绑定Js函数
/**
* 清空购物车
* 弹窗调试---》确定则返回true 取消则返回false
* @returns {boolean}
*/
function clearCart() {
var b = window.confirm("你确定要清空购物车吗?");
//如果用户确定,就跳转到相对应的Servlet上
if(b) {
return true;
}else {
return false;
}
}
根据id删除商品
package servlet;
import entity.Cart;
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;
/**
*根据id删除商品
*/
@WebServlet("/deleteCartBook")
public class deleteCartBook extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取得到用户想要删除哪个书本的id
String id = request.getParameter("bookid");
//获取该用户相对应的购物车对象
Cart cart = (Cart) request.getSession().getAttribute("cart");
try {
//删除购物车的商品,也应该是在BusinessService中有的功能,于是乎又回到BusinessService中写代码
BusinessService businessService = new BusinessService();
businessService.deleteBook(id, cart);
//删除购物车的商品后,也应该直接跳转回去购物车的显示页面中
request.getRequestDispatcher("listCart.jsp").forward(request, response);
} catch (Exception e) {
request.setAttribute("message", "购物车空了!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
根据id搜索商品
package servlet;
import entity.Book;
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;
/**
* 根据id查询商品
*/
@WebServlet("/queryBook")
public class queryBook extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取要用户输入的id
String bookid = request.getParameter("bookid");
if ("".equals(bookid)){
System.out.println("列出全部");
response.sendRedirect("listBooks");
}else {
//实例化业务层
BusinessService businessService = new BusinessService();
//调用业务层的根据id查询图书
Book book = businessService.findBook(bookid);
if (book!=null){
//将查询出来的book返回给页面
System.out.println("搜索成功");
//将搜索结果存储在request域中
request.setAttribute("book",book);
request.setAttribute("find","ok");
//转发到商品显示页面
request.getRequestDispatcher("listBook.jsp").forward(request,response);
}else {
//将查询出来的book返回给页面
System.out.println("没有查询到");
//将搜索结果存储在request域中
request.setAttribute("find","no");
//转发到商品显示页面
request.getRequestDispatcher("listBook.jsp").forward(request,response);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
总结
-
购物车应该是一个以id作为key,以购物项作为value的一个Map集合。这样设计的话,我们在显示商品的时候,就不会重复显示同一种类型的商品了。
-
购物项代表着该商品,并且应该给予购物项 数量和价钱的属性。购物项的价钱应该是数量*单价
-
购物车应该提供把商品添加到购物车的功能。当然啦,购物项代表着商品,所以首先要判断该购物车是否有同类的商品,如果有,直接在购物项的数量上+1即可的。如果没有,就设置该购物项的属性,并把购物项添加到购物车中
-
购物车的总价就是所有购物项的总价
-
无论是增删改查购物车的数据,其实就是操作这个集合
更多推荐
所有评论(0)