JavaWEB快速入门之session购物车部分功能讲解

本文详细介绍了如何使用Java实现商城系统的首页分页展示商品,包括商品实体类的创建、数据库查询以及前端页面的展示。同时,讲解了商品加入购物车的流程,包括购物车类的设计、商品信息的获取和更新,并实现了购物车的显示与分页。此外,还涵盖了购物车中商品的删除和修改功能,以及对应的后台处理。
摘要由CSDN通过智能技术生成

一、商城首页的实现(分页)
      (1)编写实体类 

package com.lixiangning.cart.entity;

public class Goods {
	private int gid;
	private String gname;
	private float gprice;
	private String ginfo;
	private String gpath;

	public Goods() {
		// TODO Auto-generated constructor stub
	}

	public Goods(String gname, float gprice, String ginfo, String gpath) {
		super();
		this.gname = gname;
		this.gprice = gprice;
		this.ginfo = ginfo;
		this.gpath = gpath;
	}

	public Goods(int gid, String gname, float gprice, String ginfo, String gpath) {
		super();
		this.gid = gid;
		this.gname = gname;
		this.gprice = gprice;
		this.ginfo = ginfo;
		this.gpath = gpath;
	}

	public int getGid() {
		return gid;
	}

	public void setGid(int gid) {
		this.gid = gid;
	}

	public String getGname() {
		return gname;
	}

	public void setGname(String gname) {
		this.gname = gname;
	}

	public float getGprice() {
		return gprice;
	}

	public void setGprice(float gprice) {
		this.gprice = gprice;
	}

	public String getGinfo() {
		return ginfo;
	}

	public void setGinfo(String ginfo) {
		this.ginfo = ginfo;
	}

	public String getGpath() {
		return gpath;
	}

	public void setGpath(String gpath) {
		this.gpath = gpath;
	}

	@Override
	public String toString() {
		return "Goods [gid=" + gid + ", gname=" + gname + ", gprice=" + gprice + ", ginfo=" + ginfo + ", gpath=" + gpath
				+ "]";
	}
	
}

      (2)编写查询所有和显示条数以及单个查询的功能

@Override
	public int getGoodsCount() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		int count = 0;// 保存表的总记录数
		try {
			conn = DBHelper.getConn();
			String sql = "select count(*) from goods";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			if (rs.next()) {
				count = rs.getInt(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBHelper.myClose(conn, ps, rs);
		}
		return count;
	}

	
	@Override
	public List<Goods> queryGoodsAll(int pageIndex, int pageSize) {
		int start = (pageIndex - 1) * pageSize + 1;
		int end = pageIndex * pageSize;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "";
		List<Goods> list = new ArrayList<Goods>();
		Goods goods = null;
		try {
			conn = DBHelper.getConn();
			sql ="select b.* from(select a.*,rownum as rid from( select * from  goods)a)b where b.rid between "+start+" and "+end+"";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				goods = new Goods(rs.getInt(1), rs.getString(2), rs.getFloat(3), rs.getString(4), rs.getString(5));
				list.add(goods);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.myClose(conn, ps, rs);
		}
		return list;
	}
	@Override
	public Goods getGoodsByCid(int gid) {
        Connection conn = null;
		PreparedStatement ps = null;
		Goods goods = null;
		String sql = "";
		ResultSet rs = null;
		try {
            conn = DBHelper.getConn();
            sql = "select * from goods where gid = "+gid;
	        ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			if (rs.next()) {
				goods = new Goods(rs.getInt(1), rs.getString(2), rs.getFloat(3), rs.getString(4), rs.getString(5));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return goods;
	}

	

      (3)商城首页显示

<table border = "1" width="100%" cellpadding="0" cellspacing="0">
			<tr>
				<th>商品编号</th>
				<th>商品名称</th>
				<th>商品价格</th>
				<th>商品描述</th>
				<th>商品图片</th>
				<th>商品操作</th>
			</tr>
			<!-- 调用dao遍历即可 -->
			<%
				//实例化
				       IGoodsBiz igb = new GoodsBizImpl();
						//定义变量存储页码以及每一夜显示的数据
						int pageIndex = 1;
						int pageSize = 4;
						int pageMax = 0;//存储最大页码
						//当点击分页区域的下一页超链接时,获取这个参数
						String pIndex = request.getParameter("pageIndex");
						//判断,只有你点击了下一页  才将pIndex赋值给pageIndex
						if (null != pIndex) {
							pageIndex = Integer.valueOf(pIndex);
						}
						//根据dao求出总记录数
						int count = igb.getGoodsCount();
						pageMax = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
				       List<Goods> listGoods = igb.queryGoodsAll(pageIndex, pageSize);
				     for(Goods goods : listGoods){
			%>
			
					<tr>
						<td><%=goods.getGid() %></td>
						<td><%=goods.getGname() %></td>
						<td><%=goods.getGprice() %></td>
						<td><%=goods.getGinfo() %></td>
						<td><img src = "<%=goods.getGpath()%>"/></td>
						<td>
							<button onclick="addCart(<%=goods.getGid()%>)">加入购物车</button>
						</td>
					</tr>
			
			<%	
				}
			%>
							<hr>
				<p align="right" style="font-size: 15px; font-weight: bold">
					当前页数:[<%=pageIndex%>/<%=pageMax%>]&nbsp; 
					<a href="index.jsp?pageIndex=1">首页</a> 
					<a href="index.jsp?pageIndex=<%=pageIndex - 1 < 0 ? 1 : pageIndex - 1%>">上一页</a>
					<a href="index.jsp?pageIndex=<%=pageIndex + 1 > pageMax ? pageMax : pageIndex + 1%>">下一页</a>
					<a href="index.jsp?pageIndex=<%=pageMax%>">末页</a>
					</p>
		</table>

      (4)点击加入购物车的事件携带参数进入do处理界面

<script type="text/javascript">
		function addCart(cid) {
			location.href = "doShopping.jsp?cid="+cid;
		}
</script>

二、商品加入购物车 

(1)先编写一个购物车类Cart来存储购物信息

package com.lixiangning.cart.entity;

public class Cart {
	private Goods goods;//对象:包含商品所有属性
	private int ccount;//数量  单个商品的数量
	private float ctotal;//单个商品的总价格
	
	public Cart() {
		// TODO Auto-generated constructor stub
	}

	public Cart(Goods goods, int ccount, float ctotal) {
		super();
		this.goods = goods;
		this.ccount = ccount;
		this.ctotal = ctotal;
	}

	public Goods getGoods() {
		return goods;
	}

	public void setGoods(Goods goods) {
		this.goods = goods;
	}

	public int getCcount() {
		return ccount;
	}

	public void setCcount(int ccount) {
		this.ccount = ccount;
	}

	public float getCtotal() {
		return ctotal;
	}
	//计算总价格
	public void setCtotal() {
		this.ctotal = this.getGoods().getGprice() * this.getCcount();
	}

	@Override
	public String toString() {
		return "Cart [goods=" + goods + ", ccount=" + ccount + ", ctotal=" + ctotal + "]";
	}

}

(2)在商品主页点击加入购物车后携带商品编号进入do处理界面

           ①先获取携带过来的商品编号

//设置编码
		request.setCharacterEncoding("utf-8");
		//获取商品编号
		String id = request.getParameter("cid");
		int cid = 0;
		if(null!=id){
			cid = Integer.valueOf(id);
		}
	

          ② 通过携带的商品编号获取整个商品信息

	//拿到cid  根据cid获取商品的其它信息
		Goods goods = new GoodsBizImpl().getGoodsByCid(cid);

          ③ 将商品的信息一并封装在Cart实体中

        //数量默认一件
		//总价格    商品的单价 * 数量(1件)
		//将上面获取的信息封装到Cart实体中
		Cart cart = new Cart();
		cart.setGoods(goods);
		cart.setCcount(1);
		cart.setCtotal();
		

        ④ 加入购物车

                4.1 点击一个就加入一个(只会存在一个商品信息)

        //点击一个就加入一个
		session.setAttribute("cart", cart);
		response.sendRedirect("cart.jsp"); 

             4.2  利用集合加入购物车(也只会存在一个商品信息)

        List<Cart> listCarts = new ArrayList<Cart>();
		listCarts.add(cart);
		session.setAttribute("listCarts", listCarts);
		response.sendRedirect("cart.jsp"); 

           4.3 利用集合,将商品加入购物车之前,先要获取购物车(可以存储多个商品信息,但是对于相同的商品不会改变数量,而是重新添加整个商品)

         List<Cart> listCarts = (List<Cart> )session.getAttribute("listCarts");
		//判断  如果购物车为null  则创建一个
		if(listCarts == null){
			//创建一个购物车容器
			listCarts = new ArrayList<Cart>();
		}
		listCarts.add(cart);
		session.setAttribute("listCarts", listCarts);
		response.sendRedirect("cart.jsp"); 

         4.4 当点击同一件商品时,如果购物车中存在,不会修改数量,只会重新添加(最完整版本)

       //1.获取购物车
		List<Cart> listCarts = (List<Cart> )session.getAttribute("listCarts");
		//2.判断非空
		boolean flag = true;
		if(null == listCarts){
			//创建购物车
			listCarts = new ArrayList<Cart>();
		}else{
			//遍历所有的购物车中的商品  
			for(Cart c : listCarts){
				//判断传递的cid与当前listCarts中的每一个cid进行匹配
				if(cid == c.getGoods().getGid()){
					flag = false;
					//修改数量
					c.setCcount(c.getCcount()+1);
					//修改总价格
					c.setCtotal();	
				}
			}
		}
		//判断flag标记
		if(flag == true){//说明购物车中没有该商品
			listCarts.add(cart);
		}
		
		//重新保存购物车
		session.setAttribute("listCarts", listCarts);	
		response.sendRedirect("cart.jsp");

    完整的do处理界面:

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.cart.entity.Cart"%>
<%@page import="com.zking.cart.entity.Goods"%>
<%@page import="com.zking.cart.biz.impl.GoodsBizImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
    String id = request.getParameter("cid");
    int cid = 0;
    if(null!=id){
    	cid = Integer.valueOf(id);
    }
    //根据商品id查询所有信息
    Goods goods = new GoodsBizImpl().getGoodsByCid(cid);
    //将查询到的商品信息封装在购物车实体中
    Cart cart = new Cart();
    cart.setGoods(goods);
    cart.setCcount(1);
    cart.setCtotal();
    //获取购物车
    List<Cart> listCarts = (List<Cart>)session.getAttribute("listCarts");
    //判断非空
    boolean flag = true;
    //为空则无商品
    if(null==listCarts){
    	//创建购物车
    	listCarts = new ArrayList<Cart>();
    	//不为空有商品
    }else{
    	//遍历购物车中的数据
    	for(Cart c : listCarts){
    		//传递商品编号判断是否存在该商品
    		if(cid==c.getGoods().getGid()){
    			flag = false;
    			//加入购物车多一件商品
    			c.setCcount(c.getCcount()+1);
    			//重新设置总价
    			c.setCtotal();
    		}
    	}
    }
    //判断是否存在该商品
    if(flag == true){
    	listCarts.add(cart);
    } 
    session.setAttribute("listCarts", listCarts);   
    response.sendRedirect("cart.jsp");
    
%>

三、购物车的显示和分页(伪分页)

         (1)首页显示布局

         (2)设置分页

         (3)调用伪分页的方法

<%@page import="com.zking.cart.entity.Cart"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>糯米团子的购物车</h2>
	<a href="index.jsp">返回主页</a>
	<table border="1" width="100%" cellpadding="0" cellspacing="0">
		<tr>
			<th>商品编号</th>
			<th>商品名称</th>
			<th>商品价格</th>
			<th>商品图片</th>
			<th>商品数量</th>
			<th>商品总价</th>
			<th>商品操作</th>
		</tr>
		<!-- 调用dao遍历即可 -->
		<%
			//获取购物车
			List<Cart> listCarts = (List<Cart>) session.getAttribute("listCarts");

			//定义变量存储页码以及每一夜显示的数据
			int pageIndex = 1;
			int pageSize = 4;
			//当点击分页区域的下一页超链接时,获取这个参数
			String pIndex = request.getParameter("pageIndex");
			//判断,只有你点击了下一页  才将pIndex赋值给pageIndex
			if (null != pIndex) {
				pageIndex = Integer.valueOf(pIndex);
			}
			//定义一个变量存储总记录数
			int pageCount = listCarts.size();
			int start = (pageIndex - 1) * pageSize;
			//sublist  参数end  没有等于
			int end = pageIndex * pageSize;
			if (end > pageCount) {
				end = pageCount;
			}
			int pageMax = pageCount / pageSize;
			if (pageCount % pageSize != 0) {
				pageMax++;
			}
			//调用伪分页的方法  subList(start,end);
			listCarts = listCarts.subList(start, end);
			for (Cart cart : listCarts) {
		%>

		<tr id="<%=cart.getGoods().getGid()%>">
			<td><%=cart.getGoods().getGid()%></td>
			<td><%=cart.getGoods().getGname()%></td>
			<td><%=cart.getGoods().getGprice()%></td>
			<td><img src="<%=cart.getGoods().getGpath()%>" /></td>
			<td>
				<button onclick="add('a',<%=cart.getGoods().getGid()%>)">-</button>
				<input type="text" style="width: 40px"
				value="<%=cart.getCcount()%>" />
				<button onclick="add('b',<%=cart.getGoods().getGid()%>)">+</button>
			</td>
			<td><%=cart.getCtotal()%></td>
			<td>
				<button onclick="delCart(<%=cart.getGoods().getGid()%>)">删除</button>
				<button onclick="updateCart(<%=cart.getGoods().getGid()%>)">修改</button>
			</td>

		</tr>

		<%
			}
		%>
	</table>
	<hr>
		<p align="right" style="font-size: 15px; font-weight: bold">
			[<%=pageIndex %>/<%=pageMax %>]
	<a href = "cart.jsp?pageIndex=1">首页</a>
	<a href = "cart.jsp?pageIndex=<%=pageIndex-1<0?1:pageIndex-1%>">上一页</a>
	<a href = "cart.jsp?pageIndex=<%=pageIndex+1>pageMax?pageMax:pageIndex+1%>">下一页</a>
	<a href="cart.jsp?pageIndex=<%=pageMax%>">尾页</a>
		</p>
			
		
</body>
</html>

四、购物车的删除|修改功能 

          (1)在主界面编写删除和修改点击事件并携带参数

	<script type="text/javascript">
	
		function delCart(id){
			if(window.confirm("您确定要删除吗?")){
				location.href="doDel.jsp?gid="+id;
			}
		}	
		
		function add(type,id){
			//根据参数id获取tr标签
			var tr = document.getElementById(id);
			//console.log(tr)
			//根据tr获取数量
			var ccount = tr.cells[4].children[1].value;
			console.log(ccount);
			if(type === 'a'){//减法
				ccount--;
			}else if(type==='b'){//加法
				ccount++;
			}
			tr.cells[4].children[1].value = ccount;
		}
		
		function updateCart(id){
			//根据id获取到数量
			var tr = document.getElementById(id);
			var ccount = tr.cells[4].children[1].value;
			location.href="doUpdate.jsp?gid="+id+"&ccount="+ccount;
		}
	
	</script>

        (2)删除的do处理界面(利用迭代器进行删除)

<%@page import="java.util.Iterator"%>
<%@page import="com.zking.cart.entity.Cart"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
	
	<%
		String id = request.getParameter("gid");
		int cid = 0;
		if(null!=id){
			cid = Integer.valueOf(id);
		}
	
		//获取购物车
		List<Cart> listCarts = (List<Cart> )session.getAttribute("listCarts");
		System.out.println(listCarts);
		
		//迭代器的方式进行删除
		Iterator<Cart> its = listCarts.iterator();
		while(its.hasNext()){
			Cart cc = its.next();
			if(cc.getGoods().getGid() == cid){
				its.remove();
			}
		}
		session.setAttribute("listCarts", listCarts);
		response.sendRedirect("cart.jsp");
		
	%>
	
	
	
	

      

(3)修改的do处理界面(通过本页面刷新不会复原)

<%@page import="com.zking.cart.entity.Cart"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
	
	<%
		String id1 = request.getParameter("gid");
		String id2 = request.getParameter("ccount");
		
		int gid = 0;
		if(id1!=null){
			gid = Integer.valueOf(id1);
		}
		int ccount = 0;
		if(id2!=null){
			ccount = Integer.valueOf(id2);
		}
		//获取购物车
		List<Cart> listCarts = (List<Cart> )session.getAttribute("listCarts");
		
		for(Cart c:listCarts){
			if(c.getGoods().getGid() == gid){
				c.setCcount(ccount);
				c.setCtotal();
			}
		}
		
		session.setAttribute("listCarts", listCarts);
	
		response.sendRedirect("cart.jsp");
	%>
	
	
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ning_ning_03

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

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

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

打赏作者

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

抵扣说明:

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

余额充值