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

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” %>

显示所有的书籍

<%–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带过去,服务器哪知道你要删除的是哪个)

开发删除商品的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的操作

**

在这里插入图片描述

现在我们可以自定义商品数量,同时还可以微调数量加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);

}

}

最后

自我介绍一下,小编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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值