一.实现流程
二.项目下的各个类
三.创建相关类
(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集合,所以在之后的学习路上我会更加努力的,希望我的这个小案例能对大家有所帮助,如果有什么不足之处请指出。