书城项目_第六阶段_购物车模块

1、购物车模块分析

在这里插入图片描述

2、购物车模型编写

2.1 、购物车模型:
/**
* 购物车的商品项
*/
public class CartItem {
	private Integer id;
	private String name;
	private Integer count;
	private BigDecimal price;
	private BigDecimal totalPrice;

}
/**
* 购物车对象
*/
public class Cart {
	/**
	* key 是商品编号,
	* value ,是商品信息
	*/
	private Map<Integer,CartItem> items = new LinkedHashMap<Integer,CartItem>();
	/**
	* 添加商品项
	*
	* @param cartItem
	*/
	public void addItem(CartItem cartItem) {
		// 先查看购物车中是否已经添加过此商品,如果已添加,则数量累加,总金额更新,如果没有添加过,直接放到集合中即可
		CartItem item = items.get(cartItem.getId());
		if (item == null) {
			// 之前没添加过此商品
			items.put(cartItem.getId(), cartItem);
		} else {
			// 已经 添加过的情况
			item.setCount( item.getCount() + 1 ); // 数量 累加
			item.setTotalPrice( item.getPrice().multiply(new BigDecimal( item.getCount() )) ); // 更新总金额
		}
	}
	/**
	* 删除商品项
	*/
	public void deleteItem(Integer id) {
		items.remove(id);
	}
	/**
	* 清空购物车
	*/
	public void clear() {
		items.clear();
	}
	/**
	* 修改商品数量
	*/
	public void updateCount(Integer id,Integer count) {
		// 先查看购物车中是否有此商品。如果有,修改商品数量,更新总金额
		CartItem cartItem = items.get(id);
		if (cartItem != null) {
			cartItem.setCount(count);// 修改商品数量
			cartItem.setTotalPrice( cartItem.getPrice().multiply(new BigDecimal( cartItem.getCount() )) ); // 更新总金额
		}
	}
	public Integer getTotalCount() {
		Integer totalCount = 0;
		for (Map.Entry<Integer,CartItem>entry : items.entrySet()) {
		totalCount += entry.getValue().getCount();
	}
	return totalCount;
}
	public BigDecimal getTotalPrice() {
		BigDecimal totalPrice = new BigDecimal(0);
		for (Map.Entry<Integer,CartItem>entry : items.entrySet()) {
			totalPrice = totalPrice.add(entry.getValue().getTotalPrice());
		}
		return totalPrice;
	}
	public Map<Integer, CartItem> getItems() {
		return items;
	}
	public void setItems(Map<Integer, CartItem> items) {
		this.items = items;
	}
	@Override
	public String toString() {
		return "Cart{" +
		"totalCount=" + getTotalCount() +
		", totalPrice=" + getTotalPrice() +
		", items=" + items +
		'}';
	}
}

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

CartServlet 程序中的代码:

/**
* 加入购物车
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void addItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
	// 获取请求的参数 商品编号
	int id = WebUtils.parseInt(req.getParameter("id"), 0);
	// 调用 bookService.queryBookById(id):Book 得到图书的信息
	Book book = bookService.queryBookById(id);
	// 把图书信息,转换成为 CartItem 商品项
	CartItem cartItem = new CartItem(book.getId(),book.getName(),1,book.getPrice(),book.getPrice());
	// 调用 Cart.addItem(CartItem); 添加商品项
	Cart cart = (Cart) req.getSession().getAttribute("cart");
	if (cart == null) {
		cart = new Cart();
		req.getSession().setAttribute("cart",cart);
	}
	cart.addItem(cartItem);
	System.out.println(cart);
	System.out.println(" 请求头 Referer 的值:" + req.getHeader("Referer"));
	// 重定向回原来商品所在的地址页面
	resp.sendRedirect(req.getHeader("Referer"));
}

index.jsp 页面 js 的代码:
在这里插入图片描述

<Script type="text/javascript">
	$(function () {
		// 给加入购物车按钮绑定单击事件
		$("button.addToCart").click(function () {
			/**
			* 在事件响应的 function 函数 中,有一个 this 对象,这个 this 对象,是当前正在响应事件的 dom 对象
			* @type {jQuery}
			*/
			var bookId = $(this).attr("bookId");
			location.href = "http://localhost:8080/book/cartServlet?action=addItem&id=" + bookId;
		});
	});
</Script>

图解说明,如何跳回添加商品的页面:
在这里插入图片描述

4、购物车的展示

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>购物车</title>
		<%-- 静态包含 base 标签、 css 样式、 jQuery 文件 --%>
		<%@ include file="/pages/common/head.jsp"%>
	</head>
	<body>
		<div id="header">
			<img class="logo_img" alt="" src="static/img/logo.gif" >
			<span class="wel_word">购物车</span>
			<%-- 静态包含,登录 成功之后的菜单 --%>
			<%@ include file="/pages/common/login_success_menu.jsp"%>
		</div>
		<div id="main">
			<table>
				<tr>
					<td>商品名称</td>
					<td>数量</td>
					<td>单价</td>
					<td>金额</td>
					<td>操作</td>
				</tr>
				<c:if test="${empty sessionScope.cart.items}">
					<%-- 如果购物车空的情况 --%>
					<tr>
						<td colspan="5"><a href="index.jsp">亲,当前购物车为空!快跟小伙伴们去浏览商品吧!!!</a>
						</td>
					</tr>
				</c:if>
				<c:if test="${not empty sessionScope.cart.items}">
					<%-- 如果购物车非空的情况 --%>
					<c:forEach items="${sessionScope.cart.items}" var="entry">
						<tr>
							<td>${entry.value.name}</td>
							<td>${entry.value.count}</td>
							<td>${entry.value.price}</td>
							<td>${entry.value.totalPrice}</td>
							<td><a href="#">删除</a></td>
						</tr>
					</c:forEach>
				</c:if>
			</table>
			<%-- 如果购物车非空才输出页面的内容 --%>
			<c:if test="${not empty sessionScope.cart.items}">
				<div class="cart_info">
					<span class="cart_span">购物车中共有
						<span class="b_count">${sessionScope.cart.totalCount}</span>件商品
					</span>
					<span class="cart_span">总金额
						<span class="b_price">${sessionScope.cart.totalPrice}</span></span>
					<span class="cart_span"><a href="#">清空购物车</a></span>
					<span class="cart_span"><a href="pages/cart/checkout.jsp">去结账</a></span>
				</div>
			</c:if>
		</div>
		<%-- 静态包含页脚内容 --%>
		<%@include file="/pages/common/footer.jsp"%>
	</body>
</html>

5、删除购物车商品项

CartServlet 程序:

/**
* 删除商品项
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void deleteItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
	// 获取商品编号
	int id = WebUtils.parseInt(req.getParameter("id"), 0);
	// 获取购物车对象
	Cart cart = (Cart) req.getSession().getAttribute("cart");
	if (cart != null) {
		// 删除 了购物车商品项
		cart.deleteItem(id);
		// 重定向回原来购物车展示页面
		resp.sendRedirect(req.getHeader("Referer"));
	}
}

购物车/pages/cart/cart.jsp 页面的代码:
删除的请求地址:
在这里插入图片描述
删除的确认提示操作:

<script type="text/javascript">
	$(function () {
		// 给 【删除】绑定单击事件
		$("a.deleteItem").click(function () {
			return confirm(" 你确定要删除【" + $(this).parent().parent().find("td:first").text() +" 】吗?")
		});
	});
</script>

6、清空购物车

CartServlet 程序

/**
* 清空购物车
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void clear(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
	// 1 获取购物车对象
	Cart cart = (Cart) req.getSession().getAttribute("cart");
	if (cart != null) {
		// 清空购物车
		cart.clear();
		// 重定向回原来购物车展示页面
		resp.sendRedirect(req.getHeader("Referer"));
	}
}

cart.jsp 页面的内容
给清空购物车添加请求地址,和添加 id 属性:
在这里插入图片描述
清空的确认提示操作:
在这里插入图片描述

7、修改购物车商品数量

CartServlet 程序

/**
* 修改商品数量
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void updateCount(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
	// 获取请求的参数 商品编号 、商品数量
	int id = WebUtils.parseInt(req.getParameter("id"),0);
	int count = WebUtils.parseInt(req.getParameter("count"), 1);
	// 获取 Cart 购物车对象
	Cart cart = (Cart) req.getSession().getAttribute("cart");
	if (cart != null) {
		// 修改商品数量
		cart.updateCount(id,count);
		// 重定向回原来购物车展示页面
		resp.sendRedirect(req.getHeader("Referer"));
	}
}

修改 pages/cart/cart.jsp 购物车页面:
在这里插入图片描述
修改商品数量 js 代码:

// 给输入框绑定 onchange 内容发生改变事件
$(".updateCount").change(function () {
	// 获取商品名称
	var name = $(this).parent().parent().find("td:first").text();
	var id = $(this).attr('bookId');
	// 获取商品数量
	var count = this.value;
	if ( confirm(" 你确定要将【" + name + " 】商品修改数量为:" + count + " 吗?") ) {
		// 发起请求。给服务器保存修改
		location.href =
		"http://localhost:8080/book/cartServlet?action=updateCount&count="+count+"&id="+id;
	} else {
		// defaultValue 属性是表单项 Dom 对象的属性。它表示默认的 value 属性值。
		this.value = this.defaultValue;
	}
});

8、首页,购物车数据回显

在添加商品到购物车的时候,保存最后一个添加的商品名称:
在这里插入图片描述
在 pages/client/index.jsp 页面中输出购物车信息:

<div style="text-align: center">
	<c:if test="${empty sessionScope.cart.items}">
		<%-- 购物车为空的输出 --%>
		<span> </span>
		<div>
			<span style="color: red">当前购物车为空</span>
		</div>
	</c:if>
	<c:if test="${not empty sessionScope.cart.items}">
		<%-- 购物车非空的输出 --%>
		<span>您的购物车中有 ${sessionScope.cart.totalCount} 件商品</span>
		<div>
			您刚刚将<span style="color: red">${sessionScope.lastName}</span>加入到了购物车中
		</div>
	</c:if>
</div>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玳宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值