巴巴运动网——购物车
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原来的那个取出来,给当前的购物车存放相应的数据