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层应该至少提供获取所有的书籍和根据关键字获取得到书籍
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层就是对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();
}
}
列出所有的书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” %>
<%–Servlet传递过来的是一个Map对象,要显示所有的书籍,就需要遍历Map集合(EL表达式和JSTL标签合用)–%>
<%–如果根据id查到数据 find==ok --%>
<c:if test=“${find==‘ok’}”>
${book.id} ${book.name} ${book.author} ${book.description} ${book.price} 添加</c:if>
<%–所有数据–%>
<c:if test=“${not empty books}”>
<c:forEach items=“${books}” var=“me”>
${me.key} ${me.value.name} ${me.value.author} ${me.value.description} ${me.value.price} 添加</c:forEach>
</c:if>
<%-- 如果没有查到数据 find==no --%>
<c:if test=“${find==‘no’}”>
无搜索结果</c:if>
购物车的案例肯定要有购买操作,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” %>
购物车显示页面
<%–empty函数是判断集合中有没有元素–%>
<%–如果购物车是没有任何购物项的–%>
<c:if test=“${empty(cart.bookmap)}”>
您还没有购买过任何的书籍呀!
</c:if>
<%–如果购物车有购物项,就应该把购物项的信息显示给用户–%>
<c:if test=“${!empty(cart.bookmap)}”>
<c:forEach items=“${cart.bookmap}” var=“me”>
${me.key} ${me.value.book.name}type=“button” value=“+” id=“${me.key}” οnclick=“updateNums(this)”>
${me.value.price} 删除</c:forEach>
合计: ${cart.price} 继续购物</c:if>
将添加到购物车的商品进行删除
如果想要删除购物车中的商品,定义一个超链接,超链接指向deleteCartServlet,将想要删除的书本的id以参数的形式带过去(如果不将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);
}
}
比如我想购买Java这本书买50本,100本,难道我要傻傻的重复添加100次嘛?所以我们要加一个多本一起购买的功能,说白了就是商品数量的自定义
。
**在购物车上,数量的值改成是输入框,同时在左右两边加上+1和-1的操作
**
现在我们可以自定义商品数量,同时还可以微调数量加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;
}
}
实现商品数量的+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);
}
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
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);
}
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-pGOpwyE2-1714860748538)]
[外链图片转存中…(img-NkZYOqPf-1714860748538)]
[外链图片转存中…(img-MvyGe8Df-1714860748539)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!