ServletCart1

购物车的一些设计代码

今天学习了servlet实现购物车的添加商品进购物车,从购物车中删除商品,计算商品的总价格

1、首先设计商品实体类items.java,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package entity;
//商品的属性
public class Items {
private int id;//商品编号
private String name;//商品名称
private String city;//商品产地
private int price;//商品价格
private int number;//商品数量
private String picture;//商品图片
//构造方法
public Items(int id, String name, String city, int price, int number,String picture) {
// TODO Auto-generated constructor stub
this.city=city;this.id=id;this.name=name;this.number=number;this.price=price;this.picture=picture;
}
public Items() {
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
}

2、设计购物车类:Cart.java。这里面有三个方法。我就分开写吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package entity;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
//购物车类
public class Cart {
//购买商品的集合,HashMap提高集合的安全性以及后面的便利
private HashMap<Items,Integer> goods;
//购物车的总金额
private double totalPrice;
//构造方法
public Cart()
{
//对上面的变量初始化
goods = new HashMap<Items,Integer>();
totalPrice = 0.0;
}
public HashMap<Items, Integer> getGoods() {
return goods;
}
public void setGoods(HashMap<Items, Integer> goods) {
this.goods = goods;
}
public double getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(double totalPrice) {
this.totalPrice = totalPrice;
}
}

a:添加商品进购物车的方法:

1
2
3
4
5
6
7
8
9
//添加商品进购物车。参数分别是购买商品的对象和数量
public boolean addGoodsInCart(Items item ,int number)
{
goods.put(item, goods.get(item)+number);
goods.put(item, number);
calTotalPrice(); //重新计算商品的总金额
}

b:删除商品的方法

1
2
3
4
5
6
7
8
//删除商品的方法
public boolean removeGoodsFromCart(Items item)
{
goods.remove(item);//goods的一个方法有remove()
calTotalPrice(); //重新计算商品的总金额
return true;
}

c:计算商品的总金额

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//计算总金额。这个方法没有参数
public double calTotalPrice()
{
double sum = 0.0;//初始化商品的总金额
Set<Items> keys = goods.keySet(); //为了遍历,首先需要获得键的集合
Iterator<Items> it = keys.iterator(); //添加一个迭代器,并获得迭代器的一个对象
while(it.hasNext())//使用wile循环遍历
{
Items i = it.next();
sum += i.getPrice()* goods.get(i);//计算总金额使用的函数
}
this.setTotalPrice(sum); //设置总金额sum
return this.getTotalPrice();//返回总金额
}

3、测试购物车类,在Cart.java中写一个main方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
//创建的对象
Items i1 = new Items(1,"高数","广州",80,500,"001.jpg");
Items i2 = new Items(2,"软件工程","上海",120,800,"002.jpg");
Cart c = new Cart();
c.addGoodsInCart(i1, 1);
c.addGoodsInCart(i2, 2);
System.out.println("购物车的总金额为:"+c.getTotalPrice());
//变量购物商品的集合
Set<Map.Entry<Items, Integer>> items= c.getGoods().entrySet();
for(Map.Entry<Items, Integer> obj:items)
{
System.out.println(obj);
}
System.out.println("购物车的总金额为"+c.getTotalPrice());
}

4、得到的结果有hash码,所以需要转换一下:在items.java下面写一个toString()方法

1
2
3
public String toString(){
return "商品编号:"+this.getId()+"商品名称"+this.getName();
}

5、如果购买的同一种商品多次呢?同样的在Cart.java中修改main方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static void main(String[] args) {
//创建的对象
Items i1 = new Items(1,"高数","广州",80,500,"001.jpg");
Items i2 = new Items(2,"软件工程","上海",120,800,"002.jpg");
//再次购买编号为2的这件商品
Items i3 = new Items(2,"软件工程","上海",120,800,"002.jpg");
Cart c = new Cart();
c.addGoodsInCart(i1, 1);
c.addGoodsInCart(i2, 2);
//再次商品进购物车
c.addGoodsInCart(i3, 3);
System.out.println("购物车的总金额为:"+c.getTotalPrice());
//变量购物商品的集合
Set<Map.Entry<Items, Integer>> items= c.getGoods().entrySet();
for(Map.Entry<Items, Integer> obj:items)
{
System.out.println(obj);
}
System.out.println("购物车的总金额为"+c.getTotalPrice());
}

这里会出现一个重要的问题:购买的同样的商品没有组合到一起,而是分别显示出来了,可喜的是商品的总金额没有问题。

6、接下来就是来解决上面的这个问题:如何保证不添加重复的商品进购物车?

我需要在实体层的entity中重写item.java从object父类继承来的equals(Object obj)和hashCode()这两个方法,下面就来写一下这两个方法吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//避免商品重复:hashCode方法、equals方法
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.getId()+this.getName().hashCode();
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(this==obj)//判断obj是不是同一个对象
{
return true;//如果是,就返回true
}
if(obj instanceof Items)//判断obj是不是商品
{
Items i = (Items)obj;//如果是,就强制类型转换为商品对象
if(this.getId()==i.getId()&&this.getName().equals(i.getName()))//判断它们的id和name是不是分别相等的
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}

不要高兴太早,虽然解决了重复添加的问题。但是还有一个新的问题出现了。那就是后面添加的相同的商品干脆就覆盖上面的原本添加的商品了。那下面我就来解决这个问题吧!

7、解决这个的办法就是在Cart.java中的“添加商品进购物车的方法addGoodsInCart()”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//添加商品进购物车。参数分别是购买商品的对象和数量
public boolean addGoodsInCart(Items item ,int number)
{
//判断商品是不是同一件商品
if(goods.containsKey(item))
{
goods.put(item, goods.get(item)+number);//注意这里逗号后面不能简单的写成number
}
else
{
goods.put(item, number); //把相同的商品加到一起
}
calTotalPrice(); //重新计算商品的总金额
return true;
}

经上面的代码,就可以把刚才提出的问题圆满的解决了。