您的位置:首页 > 编程语言 > Java开发

【j2ee spring】46、巴巴运动网——购物车

2015-07-21 14:13 645 查看
巴巴运动网——购物车

1、项目目录结构







2、项目代码

BuyItem.java

一个购物车里面需要的一些属性,我们构建一个购物车bean,购物车里面每一件商品都有

1) 购买的商品

2) 购买的数量

/**
 * 功能:这个是一个购物车的清单
 * 时间:2015年6月6日08:50:06
 * 文件:BuyItem.java
 * 作者:cutter_point
 */
package com.cutter_point.bean;

import com.cutter_point.bean.product.ProductInfo;
import com.cutter_point.bean.product.ProductStyle;

public class BuyItem 
{
    /** 购买的商品 **/
    private ProductInfo product;
    /** 购买的数量 **/
    private int amount;

    public BuyItem(ProductInfo product) {
        this.product = product;
    }
    public BuyItem(ProductInfo product, int amount) {
        this.product = product;
        this.amount = amount;
    }
    public ProductInfo getProduct() {
        return product;
    }
    public void setProduct(ProductInfo product) {
        this.product = product;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
    @Override
    public int hashCode() {
        String buyitem = product.hashCode() + "-";
        if(product.getStyles().size() > 0)
        {
            //取得第一个样式的id
            buyitem += product.getStyles().iterator().next().getId();
        }

        return buyitem.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BuyItem other = (BuyItem) obj;
        if (product == null) {
            if (other.product != null)
                return false;
        } else if (!product.equals(other.product))
            return false;

        if(product.getStyles().size() != other.getProduct().getStyles().size())
        {
            return false;
        }

        if(product.getStyles().size() > 0)
        {
            ProductStyle style = product.getStyles().iterator().next();
            ProductStyle otherstyle = other.product.getStyles().iterator().next();
            if(!style.equals(otherstyle))
                return false;
        }

        return true;
    }

}


BuyCart.java

我们购买商品需要实现购物车,购物车里面装的是我们的商品,并且我们的购物车需要有一些功能

1) 添加购物项

2) 清除所有购物项

3) 删除购物项

4) 更新购买的商品数量

5) 批量修改购买的商品数量

6) 获取商品应该付的金额

7) 获取商品的市场总价

8) 在本店购买节省的金额

/**
 * 功能:这个是一个购物车实体
 * 时间:2015年6月6日08:48:09
 * 文件:BuyCart.java
 * 作者:cutter_point
 */
package com.cutter_point.bean;

import java.util.ArrayList;
import java.util.List;

public class BuyCart 
{
    private List<BuyItem> items = new ArrayList<BuyItem>();

    /**
     * 添加购物项
     * @param item
     */
    public void addItem(BuyItem item)
    {
        if(!items.contains(item)) //比较是否存在里面必须重载两个方法equals和hashCode
        {
            items.add(item); //如果不存在的话就添加一个
        }
        else    //如果已经存在这个购物项,那么就添加一个购买数量
        {
            for(BuyItem bi : items)
            {
                if(bi.equals(item))
                {
                    bi.setAmount(bi.getAmount() + 1);
                    break;
                }
            }
        }
    }

    /**
     * 清除所有购物项
     */
    public void removeAll()
    {
        items.clear();
    }

    /**
     * 删除购物项
     * @param item
     */
    public void removeBuyItem(BuyItem item)
    {
        if(items.contains(item))
            items.remove(item);
    }

    /**
     * 更新购物车里面商品项的购买数量
     * @param item
     */
    public void updateAmount(BuyItem item)
    {
        for(BuyItem bi : items)
        {
            if(bi.equals(item))
            {
                //修改数量
                bi.setAmount(item.getAmount());
                break;
            }
        }
    }

    /**
     * 批量修改更新购物车的购买数量
     * @param items
     */
    public void updateAmount(BuyItem[] items)
    {
        for(BuyItem bi : this.items)
        {
            for(BuyItem item : items)
            {
                if(item.equals(item))
                {
                    //修改数量
                    bi.setAmount(item.getAmount());
                    break;
                }
            }
        }
    }

    /**
     * 获取应付总金额
     * @return
     */
    public Float getTotalPrice()
    {
        float allprice = 0f;
        for(BuyItem item : items)
        {
            //获取总金额
            allprice += item.getProduct().getSellprice() * item.getAmount();
        }

        return allprice;
    }

    /**
     * 获取市场总价
     * @return
     */
    public Float getTotalMarketPrice()
    {
        float allprice = 0f;
        for(BuyItem item : items)
        {
            //获取总金额
            allprice += item.getProduct().getMarketprice() * item.getAmount();
        }

        return allprice;
    }

    /**
     * 总节省金额
     * @return
     */
    public float getTotalSavePrice()
    {
        return this.getTotalMarketPrice() - this.getTotalPrice();
    }

    public List<BuyItem> getItems() {
        return items;
    }

    public void setItems(List<BuyItem> items) {
        this.items = items;
    }

}


Cart.jsp

我们购买了相应的商品之后,我们会有相应的购物车栏目,在购物车里面的商品,我们可以显示出来

<%@ page language="java" isELIgnored="false" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<TITLE>购物车 巴巴运动网</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<META http-equiv="Content-Language" content="zh-CN" />
<LINK href="css/new_cart.css" rel="stylesheet" type="text/css" />
<link href="css/global/header01.css" rel="stylesheet" type="text/css" />
<SCRIPT type="text/javascript" src="js/FoshanRen.js"></SCRIPT>
<SCRIPT type="text/javascript">
<!--
/** 获取以指定字符串为前缀的输入字段集合 **/
/** 数字输入格式是否正确(长度1-4位,第一个数字必须是1-9) **/
function numericFormat(strNumber)
{   
  var newPar=/^[1-9]\d{0,3}$/;
  return newPar.test(strNumber);
} 

function getInputsByname(name, etype)
{//
    var inputs = document.getElementsByTagName("input");
    var texts = new Array();
    var y = 0;
    for (var i = 0; i < inputs.length; i++) {
      if (inputs[i].type == etype && inputs[i].name!=null && inputs[i].name.substring(0, name.length) == name) {
            texts[y] = inputs[i];
            y++;
        }
    }
    return texts;
}

function settleAccounts()
{
    if(validateAmount()){       
        var form = document.forms["buycart"];
        form.method.value="settleAccounts";
        form.submit();
    }
}

function modifyAmount()
{
    if(validateAmount())
    {       
        var form = document.getElementById("buycart");
        form.action = "<s:url action='cart-updateAmount' />";
        form.submit();
    }
}

/** 验证购买数量字段 **/
function validateAmount()
{
    var amounts = getInputsByname("amount_", "text");
    if(amounts.length==0){
        alert("您还没有购买商品");
        return false;
    }else{
        for (var i = 0; i < amounts.length; i++) {
            var amount = amounts[i];
            if(amount.value==null || amount.value.trim()==""){
                alert("\n您购买的商品中,有的商品购买数量为空,请填写购买数量");
                amount.focus();
                return false;
            }else if(amount.value=="0"){
                alert("\n您购买的商品中,有的商品购买数量为0,如果您不需要该商品,可以删除它");
                amount.select();
                return false;
            }else if(!numericFormat(amount.value)){
                alert("\n购买数量含有非数字数据,请更正");
                amount.select();
                return false;
            }
        }
    }
    return true;
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<jsp:include page="/page/share/Head.jsp"/>
<BR>
<TABLE cellSpacing=0 cellPadding=5 width="98%" border="0" align="center">
  <TR>
    <TD><TABLE cellSpacing=0 cellPadding=0 width="96%" border=0>
      <TBODY>
        <TR>
          <TD width="24%"><IMG height=31 src="images/buy/shop-cart-header-blue.gif" width="218" border=0 /></TD>
          <TD width="34%">如果您修改了商品数量,请点击 
             <img style="CURSOR: hand; " alt="修改数量" src="images/buy/update-t-sm.gif" value="修改数量" border="0" onClick="javascript:modifyAmount()" /></TD>
          <TD width="14%" align="left">
              <a href="<s:url action="cart-deleteAll" />">
                <img style="CURSOR:hand;" alt="清空购物车" src="images/buy/az-empty-shoppingcard.gif" border="0" />
              </a>
          </TD>
          <TD width="15%" align=left><a href="/"><img src="images/buy/as-s-continus.gif" width="116" height="22" border="0" /></a></TD>
          <TD width="13%" align=right><img style="CURSOR:hand;" src="images/buy/az-by-split.gif" width="116" height="22" onClick="javascript:settleAccounts()" /></TD>
        </TR>
      </TBODY>
    </TABLE></TD>
  </TR>

  <TR>
    <TD> 
    <FORM id="buycart" name="buycart" action="##" method="post">
    <TABLE cellSpacing=0 cellPadding=6 width="100%" border=0> 
      <TR bgColor=#d7ebff>
        <TD width="457"><STRONG>我的购物车里的商品--马上购买</STRONG></TD>
        <TD width=112><DIV align=center><STRONG>市场价</STRONG></DIV></TD>
        <TD width=181><DIV align=center><STRONG>价格</STRONG></DIV></TD>
        <TD width=73><DIV align=center><STRONG>数量</STRONG></DIV></TD>
        <TD width=66> </TD>
      </TR>
<!-- loop begin -->
<s:iterator value="#request.buyCart.items" var="item">
    <TR vAlign="top"> 
        <TD> 
            <STRONG>
                <A href="" target="_blank"><s:property value="#item.product.name" /></A>
            </STRONG> 
            <span class="h3color">
                [颜色/样式:
                <s:iterator value="#item.product.styles" var="style">
                    <s:property value="#style.name" />
                </s:iterator>
                ]
            </span>
            <BR /><BR />
        </TD>
        <TD width="112" align="center">
            <SPAN class="price" title="¥<s:property value="#item.product.marketprice" />元">
                <FONT color="black">
                    <S>
                        <B>¥<s:property value="#item.product.marketprice" />元</B>
                    </S>
                </FONT>
            </SPAN>
        </TD>
        <TD width="181">
            <P align="center">
                <SPAN class="price">
                    <B>¥<s:property value="#item.product.sellprice" /> 元</B>
                </SPAN> 
            <BR />
                为您节省:
                <SPAN class="price">¥<s:property value="#item.product.savedPrice" />元 </SPAN>
            <BR /> 
            </P>    
        </TD>
        <TD align="middle" width="73">
            <input type="text" style="WIDTH: 30px" maxLength="3" 
                value="<s:property value="#item.amount" />"  
                name="amount_<s:property value="#item.product.id" />-<s:iterator value="#item.product.styles" var="style"><s:property value="#style.id" /></s:iterator>" 
                    onkeypress="javascript:InputIntNumberCheck()" />
        </TD> 
        <TD align="middle" width="66">
            <a href="<s:url action="cart-delete" />?buyitemid=<s:property value="#item.product.id" />-<s:iterator value="#item.product.styles" var="style"><s:property value="#style.id" /></s:iterator>">
                <img height="17" src="images/buy/delete.gif" width="45" border="0" />
            </a>
        </TD>
    </TR>
    <TR vAlign="top">
        <TD colSpan="5">
            <IMG height=1 src="images/buy/green-pixel.gif" width="100%" border="0" />
        </TD>
    </TR>
</s:iterator>
<!-- loop end -->     
    </TABLE></FORM>
      <table width="96%" border="0" align="left">
        <tr>
          <td width="60%" align="right">如果您修改了商品数量,请点击
            <img style="CURSOR:hand;" alt="修改数量" src="images/buy/update-t-sm.gif" value="修改数量" border="0" onClick="javascript:modifyAmount()" />
          </td>
          <td width="9%" align="right">
            <DIV align="right">
                <SPAN class="price">
                    <STRONG>
                        <B><FONT color="black">共计:</FONT></B>
                    </STRONG>
                </SPAN>
            </DIV>
          </td>
          <td width="11%" align="right">
            <DIV align="center">
                <SPAN class="price">
                    <STRONG>
                        <B class="price"> 
                            <FONT color="black"><s:property value="#request.buyCart.getTotalPrice()" /> 元</FONT>
                        </B>
                    </STRONG>
                </SPAN>
            </DIV>
          </td>
          <td width="8%" align="right"><DIV align="right"><SPAN class="price"><STRONG><B><FONT color="black">节省:</FONT></B></STRONG></SPAN></DIV></td>
          <td width="12%" align="right"><DIV align="center"><SPAN class="price"><STRONG><B class="price"><s:property value="#request.buyCart.getTotalSavePrice()" /> 元</B></STRONG></SPAN></DIV></td>
        </tr>
        <tr>
          <td colspan="3" align="right"> </td>
          <td colspan="2" align="right">
            <img style="CURSOR:hand;" src="images/buy/az-by-split.gif" width="116" height="22" onClick="javascript:settleAccounts()" />
          </td>
        </tr>
      </table></TD>
  </TR>
</TABLE>
<br>
<jsp:include page="/page/share/Foot.jsp" />
</BODY>
</HTML>




CartAction.java

我们对购物车进行相应的操作的时候,我们可以写一个控制器,用来处理相应的需求,实现购物车的各种功能

/**
 * 功能:这个是实现购物车的管理action控制器
 * 时间:2015年6月6日12:24:40
 * 文件:CartAction.java
 * 作者:cutter_point
 */
package com.cutter_point.web.action.shopping;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.cutter_point.bean.BuyCart;
import com.cutter_point.bean.BuyItem;
import com.cutter_point.bean.product.ProductInfo;
import com.cutter_point.bean.product.ProductStyle;
import com.cutter_point.web.formbean.cart.CartForm;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@Controller
@Scope("prototype")
public class CartManageAction extends ActionSupport implements  ServletRequestAware, ModelDriven<CartForm>
{
    private static final long serialVersionUID = 3076346960806313949L;
    private HttpServletRequest request;
    private CartForm formbean;

    private BuyCart getBuyCart(HttpServletRequest req)
    {
        return (BuyCart) req.getSession().getAttribute("buycart");
    }

    /**
     * 删除指定的购买项目
     * @return
     */
    public String delete()
    {
        //首先判断取得的购物车不是空的
        BuyCart buyCart = this.getBuyCart(request);
        if(buyCart != null)
        {
            //删除对应的产品
            ProductInfo product = new ProductInfo(formbean.getProductid());
            product.addProductStyle(new ProductStyle(formbean.getStyleid()));
            buyCart.removeBuyItem(new BuyItem(product)); //移除对应的这个购物项
        }
        return "cart";
    }

    /**
     * 删除所有的购物项
     * @return
     */
    public String deleteAll()
    {
        //首先判断取得的购物车不是空的
        BuyCart buyCart = this.getBuyCart(request);
        if(buyCart != null)
        {
            //删除对应的产品
            buyCart.removeAll();; //移除对应的这个购物项
        }
        return "cart";
    }

    /**
     * 更新所有的购买数量
     * @return
     */
    public String updateAmount()
    {
        //首先取得当前回话的相应的购物车
        BuyCart buyCart = this.getBuyCart(request);
        //如果购物车不为空
        if(buyCart != null)
        {
            //循环,取得所有的购物项
            for(BuyItem item : buyCart.getItems())
            {
                StringBuilder key = new StringBuilder("amount_");
                //根据对应的字符串,取得对应的修改数量
                key.append(item.getProduct().getId()).append("-");
                //然后在加上相应的类型id
                if(item.getProduct().getStyles().size() > 0)
                {
                    //如果这个商品里面有相应的类型号的话
                    key.append(item.getProduct().getStyles().iterator().next().getId());
                }
                //根据这个key在页面取得相应的数量
                String amountStr = request.getParameter(key.toString());
                if(amountStr != null && !"".equals(amountStr))
                {
                    try 
                    {
                        //如果不为空,且不是空字符传,转换为整形
                        int amount = Integer.parseInt(amountStr);
                        if(amount > 0)
                        {
                            //小于0不做处理
                            item.setAmount(amount); //设置这个数量为新的数量
                        }
                    } 
                    catch (NumberFormatException e) 
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
        return "cart";
    }

    @Override
    public void setServletRequest(HttpServletRequest arg0) 
    {
        this.request = arg0;
    }

    @Override
    public CartForm getModel() 
    {
        //从页面获取表单值
        if(formbean == null)
            formbean = new CartForm();

        return formbean;
    }

}


SiteSession.java

实现对session的监听,实现对购物车的存放,我们的购物车不放到数据库中,只是放到session中,根据浏览器可能会关闭,那么我们就可以吧购物车存放的时候给个ID号,那么我们就可以在取出来的时候根据ID号来取

/**
 * 功能:这个是为了实现对session的监听
 * 时间:2015年6月5日20:43:35
 * 文件:SiteSession.java
 * 作者:cutter_point
 */
package com.cutter_point.web.action.shopping;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SiteSession implements HttpSessionListener
{
    //这个用来存放session
    private static Map<String, HttpSession> sessions = new HashMap<String, HttpSession>();

    @Override
    public void sessionCreated(HttpSessionEvent arg0) 
    {
        //根据id号来存放session
        sessions.put(arg0.getSession().getId(), arg0.getSession());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) 
    {
        //session有超时时间限制的,时间到了我们就remove掉
        sessions.remove(arg0.getSession().getId());
    }

    /**
     * 根据session的id号取得相应的session
     * @param sessionID
     * @return
     */
    public static HttpSession getSession(String sessionID)
    {
        return sessions.get(sessionID);
    }

    /**
     * 这里是吧这个session在里面的引用删除掉
     * @param sessionID
     */
    public static void removeSession(String sessionID)
    {
        if(sessions.containsKey(sessionID))
        {
            //如果存在的话就删除掉
            sessions.remove(sessionID);
        }
    }
}


总结

我们处理购物车的时候,我们可以放到session中还可以放到cookie中,并且我们给我们一个用户使用购物车的时候给这个购物车一个id号,下一次取得时候我们还可以吧session原来的那个取出来,给当前的购物车存放相应的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: