课本案例------实现购物车购物功能(拓展版)

本文介绍了一个简单的图书购物车系统的实现过程,包括Book类、BookDB类及三个Servlet的创建:ListBookServlet用于展示所有图书;PurchaseServlet处理图书购买并将图书加入到用户的购物车;CartServlet则展示了用户选购的图书及其总价。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.实现流程


二.项目下的各个类


三.创建相关类

(1)Book,java

package cn.itcast;

import java.io.Serializable;


public class Book  implements Serializable{
	private static final long serialVersionUID = 1L;
	private String id;
	private String name;
	private double price;
	public Book(String id, String name, double price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
	
	public Book() {
		super();
	}
	public double getSubtotal() {
		return getPrice();
	}
	
	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 double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", price=" + price + "]";
	}
	
	
}
(2)BookDB.java

package cn.itcast;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

public class BookDB {
	private static Map<Object, Book> books = new LinkedHashMap<>();

	static {
		books.put("1", new Book("1", "javaweb", 88.5));
		books.put("2", new Book("2", "j2ee", 100.0));
		books.put("3", new Book("3", "springboot", 205.2));
	}
	/**
	 * 获得所有图书
	 * @return
	 */
	public static Collection<Book> getAll() {
		return books.values();
	}
	//通过id获得图书
	public static Book getBook(String id) {
		return books.get(id);
	}

}
四.servlet的创建

(1)ListBookServlet

package cn.itcast;

import java.io.IOException;
import java.util.Collection;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ListBookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		Collection<Book> books = BookDB.getAll();
		response.getWriter().write("本站提供的图书有:<br/>");
		for(Book book :books) {
			String url="/TestServlet/PurchaseServlet?id="+book.getId();
			response.getWriter().write(book.getName()+"<a href='"+url+"'>点击购买</a><br/>");
		}
	
	}
}
(2)PurchaseServlet

package cn.itcast;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class PurchaseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			String id = request.getParameter("id");
			if(id == null) {
				String url = "/TestServlet/ListBookServlet";
				response.sendRedirect(url);
				return;
			}
		Book book = BookDB.getBook(id);
		HttpSession session = request.getSession();
		@SuppressWarnings("unchecked")
		List<Book> cart = (List<Book>) session.getAttribute("cart");
		if(cart == null) {
			cart = new ArrayList<>();//首次购买,为用户创建一个购物车
			session.setAttribute("cart", cart);//将购物车存入session中
	}
		cart.add(book);//将商品放入购物车中
		Cookie cookie = new Cookie("JSESSIONID", session.getId());
		cookie.setMaxAge(60*30);//这只cookie的有效时间为30分钟
		cookie.setPath("/TestServlet");
		response.addCookie(cookie);
		String url = "/TestServlet/CartServlet";
		response.sendRedirect(url);//重定向到购物车界面
				
	}
	

}
(3)CartServlet

package cn.itcast;


import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CartServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@SuppressWarnings("unchecked")
	public  void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		List<Book> cart = null;
		boolean Purflag = true;
		HttpSession session = request.getSession();
		if(session == null) {
			Purflag = false;
		}else {
			cart = (List<Book>) session.getAttribute("cart");
			if(cart == null) {
				Purflag = false;
			}
		}
		if(!Purflag) {
			out.write("对不起您没有购买任何商品!<br/>");
		}else {
			BigDecimal total = new BigDecimal("0");
			for(Book book : cart) {
				BigDecimal subtotal = new BigDecimal(""+book.getPrice());//因为book.getPrice()获取的是double所以需要转换成字符串
				total = total.add(subtotal);
			}
			out.write("您购买的图书有<br/>");
			for(Book book : cart) {
				out.write(book.getName()+"  "+book.getPrice()+"元"+"<br/>");
			}
			out.write("总计:"+"  "+total+"元");
		}		
	}


}
五.运行结果

首先运行ListBookServlet,然后在里面选择购买图书,最后跳转到CartServlet显示你选购的图书



六.学习过程出现的错误

double total = 0.0;
for(Book book : cart){
     total+=book.getPrice();
}

在计算总计的时候如果没有设置total的精确度,则在购买多本书的时候就会出现总计显示的价格精确度过大,没有达到理想的要求,就如图示


那么问题来了,该如何来解决这个问题呢?

这就需要我们用到java提供BigDecimal,这时候就需要通过BigDecimal来控制精确度。

正确做法如下:

BigDecimal total = new BigDecimal("0");//这步的意思就是初始化total为0,因为BigDecimal里面需要的是字符串
			for(Book book : cart) {
				BigDecimal subtotal = new BigDecimal(""+book.getPrice());//因为book.getPrice()获取的是double所以需要转换成字符串
				total = total.add(subtotal);
			}
七.总结

通过这个案例发现自己对集合还有很大的欠缺,尤其是Map集合,所以在之后的学习路上我会更加努力的,希望我的这个小案例能对大家有所帮助,如果有什么不足之处请指出。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值