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

java网上图书商城(4)购物车模块1

程序员文章站 2024-03-11 20:32:07
本文实例为大家分享了购物车模块的具体代码,供大家参考,具体内容如下 使用的不是session,也不是cookie,而是表 > 添加购物条目 > 修改购...

本文实例为大家分享了购物车模块的具体代码,供大家参考,具体内容如下

使用的不是session,也不是cookie,而是表

java网上图书商城(4)购物车模块1

> 添加购物条目
> 修改购物条目的数量
> 删除条目
> 批量删除条目
> 我的购物车,即按用户查询条目
> 查询勾选的条目 

1.数据表

java网上图书商城(4)购物车模块1

复制代码 代码如下:
insert  into `t_cartitem`(`cartitemid`,`quantity`,`bid`,`uid`,`orderby`) values ('b8939fc55131469cab11e3924d40185b',1,'ce01f15d435a4c51b0ad8202a318dca7','xxx',11); 

2.cartitem

public class cartitem {
 private string cartitemid;// 主键
 private int quantity;// 数量
 private book book;// 条目对应的图书
 private user user;// 所属用户
 
 // 添加小计方法
 public double getsubtotal() {
 /*
 * 使用bigdecimal不会有误差
 * 要求必须使用string类型构造器
 */
 bigdecimal b1 = new bigdecimal(book.getcurrprice() + "");
 bigdecimal b2 = new bigdecimal(quantity + "");
 bigdecimal b3 = b1.multiply(b2);
 return b3.doublevalue();
 }

 public string getcartitemid() {
 return cartitemid;
 }

 public void setcartitemid(string cartitemid) {
 this.cartitemid = cartitemid;
 }

 public int getquantity() {
 return quantity;
 }

 public void setquantity(int quantity) {
 this.quantity = quantity;
 }

 public book getbook() {
 return book;
 }

 public void setbook(book book) {
 this.book = book;
 }

 public user getuser() {
 return user;
 }

 public void setuser(user user) {
 this.user = user;
 }
} 

小技巧:java中四舍五入 bigdecimal不会有误差

// 添加小计方法
public double getsubtotal() {
 /*
 * 使用bigdecimal不会有误差
 * 要求必须使用string类型构造器
 */
 bigdecimal b1 = new bigdecimal(book.getcurrprice() + "");
 bigdecimal b2 = new bigdecimal(quantity + "");
 bigdecimal b3 = b1.multiply(b2);
 return b3.doublevalue();
}
 

3.通过用户查询购物车条目

我的购物车条目中每个条目需要显示图书的图片 书名 单价 ,这说明需要多表查询

public list<cartitem> findbyuser(string uid) throws sqlexception {
 string sql = "select * from t_cartitem c, t_book b where c.bid=b.bid and uid=? order by c.orderby";
 list<map<string,object>> maplist = qr.query(sql, new maplisthandler(), uid);
 return tocartitemlist(maplist);
}

4.添加购物车条目----增

jsp

<div class="divform">
 <form id="form1" action="<c:url value='/cartitemservlet'/>" method="post">
 <input type="hidden" name="method" value="add"/>
 <input type="hidden" name="bid" value="${book.bid }"/>
 我要买:<input id="cnt" style="width: 40px;text-align: center;" type="text" name="quantity" value="1"/>件
 </form>
 <a id="btn" href="javascript:$('#form1').submit();"></a>
</div>

cartitemservlet

public string add(httpservletrequest req, httpservletresponse resp)
 throws servletexception, ioexception {
 /*
 * 1. 封装表单数据到cartitem(bid, quantity)
 */
 map map = req.getparametermap();
 cartitem cartitem = commonutils.tobean(map, cartitem.class);
 book book = commonutils.tobean(map, book.class);
 user user = (user)req.getsession().getattribute("sessionuser");
 cartitem.setbook(book);
 cartitem.setuser(user);
 cartitemservice.add(cartitem);
 return mycart(req, resp);
}

cartitemservice

public void add(cartitem cartitem) {
 try {
 /*
 * 1. 使用uid和bid去数据库中查询这个条目是否存在
 */
 cartitem _cartitem = cartitemdao.findbyuidandbid(
 cartitem.getuser().getuid(),
 cartitem.getbook().getbid());
 if(_cartitem == null) {//如果原来没有这个条目,那么添加条目
 cartitem.setcartitemid(commonutils.uuid());
 cartitemdao.addcartitem(cartitem);
 } else {//如果原来有这个条目,修改数量
 // 使用原有数量和新条目数量之各,来做为新的数量
 int quantity = cartitem.getquantity() + _cartitem.getquantity();
 // 修改这个老条目的数量
 cartitemdao.updatequantity(_cartitem.getcartitemid(), quantity);
 }
 } catch(exception e) {
 throw new runtimeexception(e);
 }
} 

cartitemdao

public void addcartitem(cartitem cartitem) throws sqlexception {
 string sql = "insert into t_cartitem(cartitemid, quantity, bid, uid)" +
 " values(?,?,?,?)";
 object[] params = {cartitem.getcartitemid(), cartitem.getquantity(),
 cartitem.getbook().getbid(), cartitem.getuser().getuid()};
 qr.update(sql, params);
}

 5.购物车模块页面javascript----查 

计算总计

给全选添加click事件

给所有条目的复选框添加click事件

给减号添加click事件

给加号添加click事件

批量删除

 list.jsp 

<%@ page language="java" import="java.util.*" pageencoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

 
<!doctype html public "-//w3c//dtd html 4.01 transitional//en">
<html>
 <head>
  <title>cartlist.jsp</title>
  
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">  
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="this is my page">
  <!--
  <link rel="stylesheet" type="text/css" href="styles.css">
  -->
  <script src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script>
  <script src="<c:url value='/js/round.js'/>"></script>
  
  <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/cart/list.css'/>">
<script type="text/javascript">
$(function() {
  showtotal();//计算总计
  
  /*
  给全选添加click事件
  */
  $("#selectall").click(function() {
    /*
    1. 获取全选的状态
    */
    var bool = $("#selectall").attr("checked");
    /*
    2. 让所有条目的复选框与全选的状态同步
    */
    setitemcheckbox(bool);
    /*
    3. 让结算按钮与全选同步
    */
    setjiesuan(bool);
    /*
    4. 重新计算总计
    */
    showtotal();
  });
  
  /*
  给所有条目的复选框添加click事件
  */
  $(":checkbox[name=checkboxbtn]").click(function() {
    var all = $(":checkbox[name=checkboxbtn]").length;//所有条目的个数
    var select = $(":checkbox[name=checkboxbtn][checked=true]").length;//获取所有被选择条目的个数

    if(all == select) {//全都选中了
      $("#selectall").attr("checked", true);//勾选全选复选框
      setjiesuan(true);//让结算按钮有效
    } else if(select == 0) {//谁都没有选中
      $("#selectall").attr("checked", false);//取消全选
      setjiesuan(false);//让结算失效
    } else {
      $("#selectall").attr("checked", false);//取消全选
      setjiesuan(true);//让结算有效        
    }
    showtotal();//重新计算总计
  });
  
  /*
  给减号添加click事件
  */
  $(".jian").click(function() {
    // 获取cartitemid
    var id = $(this).attr("id").substring(0, 32);
    // 获取输入框中的数量
    var quantity = $("#" + id + "quantity").val();
    // 判断当前数量是否为1,如果为1,那就不是修改数量了,而是要删除了。
    if(quantity == 1) {
      if(confirm("您是否真要删除该条目?")) {
        location = "/goods/cartitemservlet?method=batchdelete&cartitemids=" + id;
      }
    } else {
      sendupdatequantity(id, quantity-1);
    }
  });
  
  // 给加号添加click事件
  $(".jia").click(function() {
    // 获取cartitemid
    var id = $(this).attr("id").substring(0, 32);
    // 获取输入框中的数量
    var quantity = $("#" + id + "quantity").val();
    sendupdatequantity(id, number(quantity)+1);
  });
});

// 请求服务器,修改数量。
function sendupdatequantity(id, quantity) {
  $.ajax({
    async:false,
    cache:false,
    url:"/goods/cartitemservlet",
    data:{method:"updatequantity",cartitemid:id,quantity:quantity},
    type:"post",
    datatype:"json",
    success:function(result) {
      //1. 修改数量
      $("#" + id + "quantity").val(result.quantity);
      //2. 修改小计
      $("#" + id + "subtotal").text(result.subtotal);
      //3. 重新计算总计
      showtotal();
    }
  });
}

/*
 * 计算总计
 */
function showtotal() {
  var total = 0;
  /*
  1. 获取所有的被勾选的条目复选框!循环遍历之
  */
  $(":checkbox[name=checkboxbtn][checked=true]").each(function() {
    //2. 获取复选框的值,即其他元素的前缀
    var id = $(this).val();
    //3. 再通过前缀找到小计元素,获取其文本
    var text = $("#" + id + "subtotal").text();
    //4. 累加计算
    total += number(text);
  });
  // 5. 把总计显示在总计元素上
  $("#total").text(round(total, 2));//round()函数的作用是把total保留2位
}

/*
 * 统一设置所有条目的复选按钮
 */
function setitemcheckbox(bool) {
  $(":checkbox[name=checkboxbtn]").attr("checked", bool);
}

/*
 * 设置结算按钮样式
 */
function setjiesuan(bool) {
  if(bool) {
    $("#jiesuan").removeclass("kill").addclass("jiesuan");
    $("#jiesuan").unbind("click");//撤消当前元素止所有click事件
  } else {
    $("#jiesuan").removeclass("jiesuan").addclass("kill");
    $("#jiesuan").click(function() {return false;});
  }
  
}

/*
 * 批量删除
 */
function batchdelete() {
  // 1. 获取所有被选中条目的复选框
  // 2. 创建一数组,把所有被选中的复选框的值添加到数组中
  // 3. 指定location为cartitemservlet,参数method=batchdelete,参数cartitemids=数组的tostring()
  var cartitemidarray = new array();
  $(":checkbox[name=checkboxbtn][checked=true]").each(function() {
    cartitemidarray.push($(this).val());//把复选框的值添加到数组中
  });
  location = "/goods/cartitemservlet?method=batchdelete&cartitemids=" + cartitemidarray;
}

/*
 * 结算
 */
function jiesuan() {
  // 1. 获取所有被选择的条目的id,放到数组中
  var cartitemidarray = new array();
  $(":checkbox[name=checkboxbtn][checked=true]").each(function() {
    cartitemidarray.push($(this).val());//把复选框的值添加到数组中
  });  
  // 2. 把数组的值tostring(),然后赋给表单的cartitemids这个hidden
  $("#cartitemids").val(cartitemidarray.tostring());
  // 把总计的值,也保存到表单中
  $("#hiddentotal").val($("#total").text());
  // 3. 提交这个表单
  $("#jiesuanform").submit();
}
</script>
 </head>
 <body>

<c:choose>
  <c:when test="${empty cartitemlist }">
  <table width="95%" align="center" cellpadding="0" cellspacing="0">
    <tr>
      <td align="right">
        <img align="top" src="<c:url value='/images/icon_empty.png'/>"/>
      </td>
      <td>
        <span class="spanempty">您的购物车中暂时没有商品</span>
      </td>
    </tr>
  </table> 
  </c:when>
  <c:otherwise>
<table width="95%" align="center" cellpadding="0" cellspacing="0">
  <tr align="center" bgcolor="#efeae5">
    <td align="left" width="50px">
      <input type="checkbox" id="selectall" checked="checked"/><label for="selectall">全选</label>
    </td>
    <td colspan="2">商品名称</td>
    <td>单价</td>
    <td>数量</td>
    <td>小计</td>
    <td>操作</td>
  </tr>



<c:foreach items="${cartitemlist }" var="cartitem">
  <tr align="center">
    <td align="left">
      <input value="${cartitem.cartitemid }" type="checkbox" name="checkboxbtn" checked="checked"/>
    </td>
    <td align="left" width="70px">
      <a class="linkimage" href="<c:url value='/jsps/book/desc.jsp'/>"><img border="0" width="54" align="top" src="<c:url value='/${cartitem.book.image_b }'/>"/></a>
    </td>
    <td align="left" width="400px">
      <a href="<c:url value='/jsps/book/desc.jsp'/>"><span>${cartitem.book.bname }</span></a>
    </td>
    <td><span>¥<span class="currprice">${cartitem.book.currprice }</span></span></td>
    <td>
      <a class="jian" id="${cartitem.cartitemid }jian"></a><input class="quantity" readonly="readonly" id="${cartitem.cartitemid }quantity" type="text" value="${cartitem.quantity }"/><a class="jia" id="${cartitem.cartitemid }jia"></a>
    </td>
    <td width="100px">
      <span class="price_n">¥<span class="subtotal" id="${cartitem.cartitemid }subtotal">${cartitem.subtotal }</span></span>
    </td>
    <td>
      <a href="<c:url value='/cartitemservlet?method=batchdelete&cartitemids=${cartitem.cartitemid }'/>">删除</a>
    </td>
  </tr>
</c:foreach>
  
  <tr>
    <td colspan="4" class="tdbatchdelete">
      <a href="javascript:batchdelete();">批量删除</a>
    </td>
    <td colspan="3" align="right" class="tdtotal">
      <span>总计:</span><span class="price_t">¥<span id="total"></span></span>
    </td>
  </tr>
  <tr>
    <td colspan="7" align="right">
      <a href="javascript:jiesuan();" id="jiesuan" class="jiesuan"></a>
    </td>
  </tr>
</table>
  <form id="jiesuanform" action="<c:url value='/cartitemservlet'/>" method="post">
    <input type="hidden" name="cartitemids" id="cartitemids"/>
    <input type="hidden" name="total" id="hiddentotal"/>
    <input type="hidden" name="method" value="loadcartitems"/>
  </form>

  </c:otherwise>
</c:choose>
 </body>
</html>

小技巧:js中四舍五入round.js

// 5. 把总计显示在总计元素上
$("#total").text(round(total, 2));//round()函数的作用是把total保留2位 


6.批量删除功能----删

jsp

function batchdelete() {
 // 1. 获取所有被选中条目的复选框
 // 2. 创建一数组,把所有被选中的复选框的值添加到数组中
 // 3. 指定location为cartitemservlet,参数method=batchdelete,参数cartitemids=数组的tostring()
 var cartitemidarray = new array();
 $(":checkbox[name=checkboxbtn][checked=true]").each(function() {
  cartitemidarray.push($(this).val());//把复选框的值添加到数组中
 });
 location = "/goods/cartitemservlet?method=batchdelete&cartitemids=" + cartitemidarray;
}

删除一个

if(quantity == 1) {
 if(confirm("您是否真要删除该条目?")) {
  location = "/goods/cartitemservlet?method=batchdelete&cartitemids=" + id;
 }
} else {
 

7.修改数量----改  

jsp

// 请求服务器,修改数量。
function sendupdatequantity(id, quantity) {
 $.ajax({
 async:false,
 cache:false,
 url:"/goods/cartitemservlet",
 data:{method:"updatequantity",cartitemid:id,quantity:quantity},
 type:"post",
 datatype:"json",
 success:function(result) {
 //1. 修改数量
 $("#" + id + "quantity").val(result.quantity);
 //2. 修改小计
 $("#" + id + "subtotal").text(result.subtotal);
 //3. 重新计算总计
 showtotal();
 }
 });
}

servlet

public string updatequantity(httpservletrequest req, httpservletresponse resp)
 throws servletexception, ioexception {
 string cartitemid = req.getparameter("cartitemid");
 int quantity = integer.parseint(req.getparameter("quantity"));
 cartitem cartitem = cartitemservice.updatequantity(cartitemid, quantity);
 
 // 给客户端返回一个json对象
 stringbuilder sb = new stringbuilder("{");
 sb.append("\"quantity\"").append(":").append(cartitem.getquantity());
 sb.append(",");
 sb.append("\"subtotal\"").append(":").append(cartitem.getsubtotal());
 sb.append("}");
 
 resp.getwriter().print(sb);
 return null;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。