一、商城首页的实现(分页)
(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%>] <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"); %>