D15 Sping Boot 入门 Sping框架--Java Web之书城项目 购物车模块

Posted 菜鸟的博客笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D15 Sping Boot 入门 Sping框架--Java Web之书城项目 购物车模块相关的知识,希望对你有一定的参考价值。

需求分析

 购物车模块(Session方法)

   Ⅰ、购物车模型创建

    在com.gychen.pojo里创建CartItem商品项对象和Cart购物车对象

 1 package com.gychen.pojo;
 2 
 3 import java.math.BigDecimal;
 4 
 5 /**
 6  * 购物车商品项
 7  */
 8 public class CartItem {
 9 
10     private Integer id;
11     private String name;
12     private Integer count;
13     private BigDecimal price;
14     private BigDecimal totalPrice;
15 
16     public Integer getId() {
17         return id;
18     }
19 
20     public void setId(Integer id) {
21         this.id = id;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public void setName(String name) {
29         this.name = name;
30     }
31 
32     public Integer getCount() {
33         return count;
34     }
35 
36     public void setCount(Integer count) {
37         this.count = count;
38     }
39 
40     public BigDecimal getPrice() {
41         return price;
42     }
43 
44     public void setPrice(BigDecimal price) {
45         this.price = price;
46     }
47 
48     public BigDecimal getTotalPrice() {
49         return totalPrice;
50     }
51 
52     public void setTotalPrice(BigDecimal totalPrice) {
53         this.totalPrice = totalPrice;
54     }
55 
56 
57     /**
58      * 商品项信息
59      * @param id 商品id
60      * @param name 商品名称
61      * @param count 商品数量
62      * @param price 商品单价
63      * @param totalPrice 商品总价
64      */
65     public CartItem(Integer id, String name, Integer count, BigDecimal price, BigDecimal totalPrice) {
66         this.id = id;
67         this.name = name;
68         this.count = count;
69         this.price = price;
70         this.totalPrice = totalPrice;
71     }
72 
73 
74     public CartItem() {
75     }
76 
77     @Override
78     public String toString() {
79         return "CartItem{" +
80                 "id=" + id +
81                 ", name=\'" + name + \'\\\'\' +
82                 ", count=" + count +
83                 ", price=" + price +
84                 ", totalPrice=" + totalPrice +
85                 \'}\';
86     }
87 }
88 
89 CartItem.java
CartItem.java
 1 package com.gychen.pojo;
 2 
 3 import java.math.BigDecimal;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 /**
 8  * 购物车对象
 9  */
10 public class Cart {
11 
12     private Integer totalCount;
13     private BigDecimal totalPrice;
14     private List<CartItem> items = new ArrayList<CartItem>();
15 
16 
17     public Integer getTotalCount() {
18         return totalCount;
19     }
20 
21     public void setTotalCount(Integer totalCount) {
22         this.totalCount = totalCount;
23     }
24 
25     public BigDecimal getTotalPrice() {
26         return totalPrice;
27     }
28 
29     public void setTotalPrice(BigDecimal totalPrice) {
30         this.totalPrice = totalPrice;
31     }
32 
33     public List<CartItem> getItems() {
34         return items;
35     }
36 
37     public void setItems(List<CartItem> items) {
38         this.items = items;
39     }
40 
41 
42     public Cart(Integer totalCount, BigDecimal totalPrice, List<CartItem> items) {
43         this.totalCount = totalCount;
44         this.totalPrice = totalPrice;
45         this.items = items;
46     }
47 
48     public Cart() {
49     }
50 
51 
52     @Override
53     public String toString() {
54         return "Cart{" +
55                 "totalCount=" + totalCount +
56                 ", totalPrice=" + totalPrice +
57                 ", items=" + items +
58                 \'}\';
59     }
60 }
61 
62 Cart.java
Cart.java

    在Cart对象中添加需要的方法

  1 package com.gychen.pojo;
  2 
  3 import java.math.BigDecimal;
  4 import java.util.LinkedHashMap;
  5 import java.util.Map;
  6 
  7 /**
  8  * 购物车对象
  9  */
 10 public class Cart {
 11 
 12 //    private Integer totalCount;
 13 //    private BigDecimal totalPrice;
 14     /**
 15      * key是商品编号
 16      * value是商品信息
 17      */
 18     private Map<Integer,CartItem> items = new LinkedHashMap<Integer, CartItem>();
 19 
 20 
 21     /**
 22      * 添加商品项
 23      * @param cartItem 商品项对象
 24      */
 25     public void addItem(CartItem cartItem){
 26 
 27         //先查看购物车中是否已经添加过此商品
 28         //1、如果已添加,则数量+1
 29         //2、如果未添加,直接方到集合中即可
 30         CartItem item = items.get(cartItem.getId());
 31         if (item == null){
 32             //之前没有添加过此商品
 33             items.put(cartItem.getId(),cartItem);
 34         }else {
 35 
 36             //已经添加过的情况  数量+1,总价更新
 37             item.setCount(item.getCount() + 1);  //数量累加
 38             item.setTotalPrice(item.getPrice().multiply(new BigDecimal(item.getCount())));  //更新总金额
 39         }
 40 
 41     }
 42 
 43 
 44 
 45     /**
 46      * 删除商品项
 47      * @param id 商品项id
 48      */
 49     public void deleteItem(Integer id){
 50 
 51         items.remove(id);
 52     }
 53 
 54 
 55     /**
 56      * 清空购物车
 57      */
 58     public void clear(){
 59 
 60         items.clear();
 61     }
 62 
 63 
 64     /**
 65      * 修改商品数量
 66      * @param id 商品项id
 67      * @param count 商品数量
 68      */
 69     public void uppdateCount(Integer id, Integer count){
 70 
 71         //先查看购物车是否有此商品,如果有修改数量,更新总金额
 72 
 73         CartItem cartItem = items.get(id);
 74         if (cartItem != null){
 75             cartItem.setCount(count); //修改商品数量
 76             cartItem.setTotalPrice(cartItem.getPrice().multiply(new BigDecimal(cartItem.getCount())));  //更新总金额
 77         }
 78     }
 79 
 80 
 81 
 82 
 83 
 84     private Integer getTotalCount() {
 85         Integer totalCount = 0;
 86         //法一:遍历Map集合中的每个键值对
 87         for (Map.Entry<Integer,CartItem>entry : items.entrySet()){
 88             totalCount += entry.getValue().getCount();
 89         }
 90 //        //法二:
 91 //        for (CartItem value : items.values()) {
 92 //            totalCount += value.getCount();
 93 //        }
 94         return totalCount;
 95     }
 96 
 97     //实际上并不需要
 98 //    public void setTotalCount(Integer totalCount) {
 99 //        this.totalCount = totalCount;
100 //    }
101 
102     private BigDecimal getTotalPrice() {
103         BigDecimal totalPrice = new BigDecimal(0);
104         for (Map.Entry<Integer,CartItem>entry : items.entrySet()){
105             totalPrice = totalPrice.add(entry.getValue().getTotalPrice());
106         }
107         return totalPrice;
108     }
109 
110 //    public void setTotalPrice(BigDecimal totalPrice) {
111 //        this.totalPrice = totalPrice;
112 //    }
113 
114     public Map<Integer,CartItem> getItems() {
115         return items;
116     }
117 
118     public void setItems(Map<Integer,CartItem> items) {
119         this.items = items;
120     }
121 
122 
123 
124     @Override
125     public String toString() {
126         return "Cart{" +
127                 "totalCount=" + getTotalCount() +
128                 ", totalPrice=" + getTotalPrice() +
129                 ", items=" + items +
130                 \'}\';
131     }
132 }
133 
134 Cart.java
Cart.java

    添加CartTest测试

 1 package com.gychen.test;
 2 
 3 import com.gychen.pojo.Cart;
 4 import com.gychen.pojo.CartItem;
 5 import org.junit.Test;
 6 
 7 import java.math.BigDecimal;
 8 
 9 import static org.junit.Assert.*;
10 
11 public class CartTest {
12 
13 
14     @Test
15     public void addItem() {
16         Cart cart = new Cart();
17         cart.addItem(new CartItem(1,"java从入门到精通",1,new BigDecimal(200),new BigDecimal(200)));
18         cart.addItem(new CartItem(2,"python从入门到精通",1,new BigDecimal(100),new BigDecimal(100)));
19         cart.addItem(new CartItem(1,"java从入门到精通",1,new BigDecimal(200),new BigDecimal(200)));
20         System.out.println(cart);
21     }
22 
23     @Test
24     public void deleteItem() {
25         Cart cart = new Cart();
26         cart.addItem(new CartItem(1,"java从入门到精通",1,new BigDecimal(300),new BigDecimal(300)));
27         cart.addItem(new CartItem(2,"python从入门到精通",1,new BigDecimal(100),new BigDecimal(100)));
28         cart.addItem(new CartItem(1,"java从入门到精通",1,new BigDecimal(300),new BigDecimal(300)));
29 
30         cart.deleteItem(1);
31 
32         System.out.println(cart);
33     }
34 
35     @Test
36     public void clear() {
37 
38         Cart cart = new Cart();
39         cart.addItem(new CartItem(1,"java从入门到精通",1,new BigDecimal(400),new BigDecimal(400)));
40         cart.addItem(new CartItem(2,"python从入门到精通",1,new BigDecimal(200),new BigDecimal(200)));
41         cart.addItem(new CartItem(1,"java从入门到精通",1,new BigDecimal(400),new BigDecimal(400)));
42 
43         cart.clear();
44 
45         System.out.println(cart);
46     }
47 
48     @Test
49     public void uppdateCount() {
50 
51         Cart cart = new Cart();
52         cart.addItem(new CartItem(1,"Spring从入门到精通",1,new BigDecimal(400),new BigDecimal(400)));
53         cart.addItem(new CartItem(2,"python从入门到精通",1,new BigDecimal(200),new BigDecimal(200)));
54         cart.addItem(new CartItem(1,"Spring从入门到精通",1,new BigDecimal(400),new BigDecimal(400)));
55 
56         cart.uppdateCount(2,4);
57         cart.uppdateCount(1,1);
58         System.out.println(cart);
59     }
60 }
CartTest.java

  Ⅱ、加入购物车功能的实现

1         //1、获取请求的参数
2         //2、调用BookService.queryBookById(id):Book得到图书的信息
3         //3、把图书信息转化为CartItem商品项
4         //4、调用Cart.addItem(cartItem);添加商品项
5         //4、重定向回列表页                    

    在com.gychen.web中新建CartServlet的addItem方法  

 1  private BookService bookService = new BookServiceImpl();
 2     /**
 3      * 添加购物车
 4      * @param req 请求
 5      * @param resp 响应
 6      */
 7     protected void addItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 8 
 9         //1、获取请求的参数
10         //2、调用BookService.queryBookById(id):Book得到图书的信息
11         //3、把图书信息转化为CartItem商品项
12         //4、调用Cart.addItem(cartItem);添加商品项
13         //5、重定向回列表页
14 
15         //1、获取请求的参数
16         int id = WebUtils.parseInt(req.getParameter("id"),0);
17 
18         //2、调用BookService.queryBookById(id):Book得到图书的信息
19 
20         Book book = bookService.querryBookById(id);
21 
22         //3、把图书信息转化为CartItem商品项
23         CartItem cartItem = new CartItem(book.getId(),book.getName(),1,book.getPrice(),book.getPrice());
24 
25         //4、调用Cart.addItem(cartItem);添加商品项
26         Cart cart = (Cart) req.getSession().getAttribute("cart");
27         if (cart == null){
28 
29             cart = new Cart();
30             req.getSession().setAttribute("cart",cart);
31         }
32 
33         cart.addItem(cartItem);
34 
35         //最后一个添加的商品名称
36         req.getSession().setAttribute("lastName",cartItem.getName());
37         //5、重定向回列表页
38         //获取浏览器访问时的地址再重定向回去
39         resp.sendRedirect(req.getHeader("Referer"));
40     }
addItem();
  1 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2 <%--
  3   Created by IntelliJ IDEA.
  4   User: 99622
  5   Date: 2020/3/30
  6   Time: 20:18
  7   To change this template use File | Settings | File Templates.
  8 --%>
  9 <%@ page
 10         contentType="text/html;charset=UTF-8"
 11         language="java"
 12         errorPage="/error500.jsp"
 13         autoFlush="true"
 14         buffer="8kb"
 15 %>
 16 <!--
 17 errorPage表示错误后

以上是关于D15 Sping Boot 入门 Sping框架--Java Web之书城项目 购物车模块的主要内容,如果未能解决你的问题,请参考以下文章

D08 Sping Boot 入门 Sping框架--Java Web之JSP

D16 Sping Boot 入门 Sping框架--Java Web之书城项目 dingda模块

D16 Sping Boot 入门 Sping框架--Java Web之书城项目 dingda模块

D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器

D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器

D09 Sping Boot 入门 Sping框架--Java Web之El表达式和JSTL标签