欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 mvc进阶项目(五)

程序员文章站 2024-01-05 23:44:22
文章目录前言实体类ShoppingAction1.增加2.删除3.修改4.清空购物车shoppingCar.jsp前言今天实现了购物车的清空、删除、更新、以及判断商品重复功能。实体类这里加了一个计算的方法,在商品相同的情况下进行计算然后赋值到total。 private String name;private float price;//单价private int num;//数量private float total;//小记public ShoppingVo()...

前言

今天实现了购物车的清空、删除、更新、以及判断商品重复功能。

荐
                                                        mvc进阶项目(五)

实体类

这里加了一个计算的方法,在商品相同的情况下进行计算然后赋值到total。

    private String name;
	private float  price;//单价
	private int num;//数量
	private float  total;//小记
	public ShoppingVo() {}
//专门用来计算单个商品的总价
		public void  calc() {
			//单个商品总价=数量*单价
			this.total=num*price;
		}
get........
set............

ShoppingAction

1.增加

根据name值去判断如果相同的话就当前全局中的集合进行数量加1,否则就进行增加。

//加入购物车
	public String add(HttpServletRequest req,HttpServletResponse resp) throws UnsupportedEncodingException {
		//解码
		String name = java.net.URLDecoder.decode(req.getParameter("name"), "utf-8");
		shoppingVo.setName(name);
		ServletContext ctx = req.getServletContext();
		String u = (String)req.getSession().getAttribute("id");
//			给每一个用户添加一个购物车的编号
			String shopname="shopcars_"+u;
//		在application中不存储list集合,而会存储json串
		List<ShoppingVo> shopcars = (List<ShoppingVo>)ctx.getAttribute(shopname);
		if(null==shopcars||shopcars.size()==0) {
//			第一次添加购物车的时候,购物车中是没有商品的
			shopcars=new ArrayList<ShoppingVo>();
			shopcars.add(shoppingVo);
		}else {
//			第二次之后添加购物车的时候,购物车里面是有商品的
			boolean f=false;
			for (ShoppingVo s : shopcars) {
				if(shoppingVo.getName().equals(s.getName())) {
					s.setNum(s.getNum()+1);
					s.calc();
					f=true;
				}
			}
			if(!f) {
				shopcars.add(shoppingVo);
			}
		}
		ctx.setAttribute(shopname, shopcars);
		req.setAttribute("shoppingVo", shopcars);
		return "shoppingCar";
	}

2.删除

这里我要声明一下,删除的时候不能用list的fore来删除因为它是不安全的,会报错并发修改异常的错误,其实原理很简单,list增加和删除modcount值是会进行增加的,fore是基于迭代器的刚开始两个modcount值是相等的,当list里面元素删除的时候modCount进行了加1,而fore中的modCount没有变所以fore中的底层会抛出并发修改异常。

安全的方式是用迭代器来实现因为它是基于源数据的。
我采取的是java8中提供的Lambad表达式来进行简洁的实现。

//删除
		public String del(HttpServletRequest req,HttpServletResponse resp) throws UnsupportedEncodingException {
			shoppingVo.setName(java.net.URLDecoder.decode(req.getParameter("name"), "utf-8"));
			ServletContext ctx = req.getServletContext();
			String u = (String)req.getSession().getAttribute("id");
//			给每一个用户添加一个购物车的编号
			String shopname="shopcars_"+u;
			List<ShoppingVo> shopcars = (List<ShoppingVo>)ctx.getAttribute(shopname);
			//java8中提供的新街口
			shopcars.removeIf(i -> i.getName().equals(shoppingVo.getName()) );
			ctx.setAttribute(shopname, shopcars);
			req.setAttribute("shoppingVo", shopcars);
			return "shoppingCar";
		}

3.修改

同理都是基于name值相等来判断,然后用迭代器实现将符合条件的当前对象的数量赋值为你传过来的数量然后进行计算。

//修改
		public String update(HttpServletRequest req,HttpServletResponse resp) throws UnsupportedEncodingException {
			shoppingVo.setName(java.net.URLDecoder.decode(req.getParameter("name"), "utf-8"));
			ServletContext ctx = req.getServletContext();
			String u = (String)req.getSession().getAttribute("id");
//			给每一个用户添加一个购物车的编号
			String shopname="shopcars_"+u;
			List<ShoppingVo> shopcars = (List<ShoppingVo>)ctx.getAttribute(shopname);
			Iterator<ShoppingVo> iterator = shopcars.iterator();
			while(iterator.hasNext()) {
				ShoppingVo next = iterator.next();
				if(shoppingVo.getName().equals(next.getName())) {
				      next.setNum(shoppingVo.getNum());
				      next.calc();
				}
			}
			ctx.setAttribute(shopname, shopcars);
			req.setAttribute("shoppingVo", shopcars);
			return "shoppingCar";
		}

4.清空购物车

只需要把全局作用域的集合赋值为null即可。

//清空购物车
		public String emptyShop(HttpServletRequest req,HttpServletResponse resp) throws UnsupportedEncodingException {
			ServletContext ctx = req.getServletContext();
			String u = (String)req.getSession().getAttribute("id");
//			给每一个用户添加一个购物车的编号
			String shopname="shopcars_"+u;
			List<ShoppingVo> shopcars = (List<ShoppingVo>)ctx.getAttribute(shopname);
			shopcars=null;
			ctx.setAttribute(shopname, shopcars);
			req.setAttribute("shoppingVo", shopcars);
			return "shoppingCar";
		}

shoppingCar.jsp

这里采取的是foreach配合onclick来实现

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
			<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/static/css/bootstrap.min.css" />
		<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/static/css/fg.css" />
		<title>购物界面</title>

	</head>
	<body class="body">
		<div class="container">
			<!-- 横幅 -->
			<div class="row">
				<div class="col-sm-3">
					您好,欢迎来到飞凡网上书店 !
				</div>
				<div class="col-sm-3 col-sm-offset-6">
					<a href="">登陆</a> | <a href="">注册</a> | <b>我的购物车</b> | <i>网站首页</i>
				</div>
			</div>

			<!--搜索栏  -->
			<div class="row ">
				<div class="col-sm-12 search-parent">
					<!-- 本来这里应该放一张背景图的 -->
					<div class="search"></div>
					<input type="text" id="book_name" name="name" value="" />
					<button type="button" class="btn btn-primary">搜索</button>
				</div>
			</div>

			<!--主内容区  -->
			<div class="row content l-content">
				<div class="col-sm-3">
					<ul class="list-group c-category">
						<!-- 白色字体未出现 -->
						<li class="list-group-item text-white bg-color1" style="color: white;">书籍分类</li>
					</ul>
				</div>
				<div class="col-sm-9">
					<table class="table shop-table">
						<thead class="bg-color2" >
							<tr>
								<th scope="col">书名</th>
								<th scope="col">单价</th>
								<th scope="col">数量</th>
								<th scope="col">小计</th>
								<th scope="col">操作</th>
							</tr>
						</thead>
						<tbody>
							
							<c:forEach  items="${shoppingVo }" var="d">
							<tr>
								<td>${d.name }</td>
								<td>${d.price }</td>
								<td>
								<input value="${d.num }"  id="${d.name}"/>
								</td>
								<td>${d.total}</td>
								<td>
									<a href="#" onclick="del('${d.name}')">删除</a>&nbsp;&nbsp;
									<a href="#" onclick="update('${d.name}')">更新</a>
								</td>
							</tr>
							</c:forEach>
							
							<tr>
								<td colspan="5" class="shop-table-btn">
									<button onclick="Empty()" class="btn btn-danger ">
							      	清空购物车
								   </button>&nbsp;&nbsp;
								   <a href="javascript:history.go(-1)" class="btn btn-danger ">继续购物</a>
									<!-- //<button class="btn btn-danger ">	</button> -->&nbsp;&nbsp;
									<button class="btn btn-danger" style="margin-left: 80px">去结算</button>&nbsp;&nbsp;
								</td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			<hr color="#DFDFDF">
			<!--底部版权 -->
			<div class="row">
				<div class="col-sm-12 text-center">
					Copyright ©2020 版权所有
				</div>
			</div>
		</div>
		<input type="hidden" id="ctx" value="${pageContext.request.contextPath }">
			<script src="${pageContext.request.contextPath }/static/js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
		    	<script src="${pageContext.request.contextPath }/static/js/common.js" type="text/javascript" charset="utf-8"></script>
	
		<script type="text/javascript">
		function Empty(){
		var f=	confirm('您确认想要清空购物车吗?');
			if(f){
				location.href="${pageContext.request.contextPath }/shopping.action?methodName=emptyShop";	
			}	
		            	
		}
		function del(namea){
			var f=	confirm('您确认要删除该商品吗?');
			if(f){
					location.href="${pageContext.request.contextPath }/shopping.action?methodName=del&name="+encodeURI(encodeURI(namea));	
				}	
			            	
			}
		function update(nameb){
			var num=$(nameb).val();
			location.href="${pageContext.request.contextPath }/shopping.action?methodName=update&name="+encodeURI(encodeURI(nameb))+"&num="+num;	
			}	
		</script>
	</body>
</html>

本文地址:https://blog.csdn.net/qq_45384482/article/details/107294141