首页 > 编程学习 > JSP购物车案例精简版-适合小白学习

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

发布时间:2022/12/10 17:54:41

前言

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

效果

在这里插入图片描述

案例打包下载


构建环境

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

设计实体

书籍实体

package entity;/*** 书籍实体类*/
public class Book {//书籍idprivate 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;}@Overridepublic 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);//默认把该书籍的数量设置为1cartItem.setQuantity(1);//把购物项添加到购物车去bookmap.put(book.getId(),cartItem);}else {//如果购物项存在,将购物项的数量+1cartItem.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() {//默认购物车总价格为 0double 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 {//实例化daobookDao 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){//如果删除后数量为---0deleteBook(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且带上参数idwindow.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 {//获取得到传递过来的idString 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)"><inputtype="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 {//获取得到用户想要删除哪个书本的idString 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 {//获取这本书的idString 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 {//获取这本书的idString 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 {//获取得到用户想要删除哪个书本的idString 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 {//获取要用户输入的idString 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即可的。如果没有,就设置该购物项的属性,并把购物项添加到购物车中

  • 购物车的总价就是所有购物项的总价

  • 无论是增删改查购物车的数据,其实就是操作这个集合


本文链接:https://www.ngui.cc/el/2314903.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000