上一节我们将商品的详细页面做完了,并使用了hibernate的二级缓存加载详细页面来提高系统的性能。这节我们开始做购物车部分。

1. 添加新的表

首先我们向数据库中添加几张表:用户表、订单状态表、订单表(购物车表)以及购物项表。用户表中存有用户的基本信息,订单状态表中主要存储订单的状态,比如已发货这种,订单表主要存储用户的信息和订单的状态,所以跟用户表和订单状态表关联,购物项表存储某个商品以及所属的订单,所以跟商品表和订单表相关联。具体的表信息见下面的sql语句:

/*============================*/
/* Table: 用户表结构               */
/*============================*/
create table user
(  /* 用户编号,自动增长 */  id                  int primary key not null auto_increment,  /* 用户登录名 */  login               varchar(20),  /* 用户真实姓名 */  name                varchar(20),  /* 用户登录密码 */  pass                varchar(20),  /* 用户性别 */  sex                 varchar(20),  /* 用户电话 */  phone               varchar(20),  /* 用户Email */  email               varchar(20)
);  /*=============================*/
/* Table: 订单状态表结构              */
/*=============================*/
create table status
(  /* 状态编号,自动增长 */  id                  int primary key not null auto_increment,  /* 订单状态 */  status               varchar(10)
);  /*=============================*/
/* Table: 购物车(订单)表结构           */
/*=============================*/
create table forder
(  /* 订单编号,自动增长 */  id                  int primary key not null auto_increment,  /* 收件人名字 */  name                varchar(20),  /* 收件人电话 */  phone               varchar(20),  /* 配送信息 */  remark              varchar(20),  /* 下单日期 */  date                timestamp default CURRENT_TIMESTAMP,  /* 订单总金额 */  total               decimal(8,2),  /* 收件人邮编 */  post                varchar(20),  /* 收件人邮编 */  address             varchar(200),  /* 订单状态 */  sid                 int default 1,  /* 会员编号 */  uid                 int,  constraint sid_FK foreign key(sid) references status(id),  constraint uid_FK foreign key(uid) references user(id)
);  /*=============================*/
/* Table: 购物项表结构               */
/*=============================*/  create table sorder
(  /* 购物项编号,自动增长 */  id                  int primary key not null auto_increment,  /* 被购买商品的名称 */  name                varchar(20),  /* 购买时商品的价格 */  price               decimal(8,2),  /* 购买的数量 */  number              int not null,  /* 所属商品编号 */  pid                  int,  /* 此订单项,所属的订单编号 */  fid                  int,  constraint pid_FK foreign key(pid) references product(id),  constraint fid_FK foreign key(fid) references forder(id)
);

然后我们将这些表通过逆向工程转换为POJO,具体不在赘述。http://blog.csdn.net/eson_15/article/details/51277324#t9

2. 购物车的后台逻辑

2.1 Service层的逻辑

当用户将某个商品加入购物车时,我们首先要通过商品的id获取该商品信息,然后将该商品添加到购物车中,在添加之前,我们首先得判断当前session中有没有购物车,如果没有的话,我们得先创建一个购物车,如果有,我们将当前的购物项添加到购物车里,在添加之前,需要先判断该购物项在购物车中是否已经存在了,如果存在了只需要增加相应的购物数量即可,如果不存在则添加,然后计算购物总价格,最后将购物车存到session中。整个流程见下面的示意图:

接下来我们来实现具体的逻辑,首先新建两个Service接口:SorderService和ForderService。SorderService中主要定义了两个方法:将用户添加的商品转换为购物项,然后将购物项添加到购物车;ForderService中主要定义了计算购物车总价格的方法,如下:

//SorderService接口
public interface SorderService extends BaseService<Sorder> {  //添加购物项,返回新的购物车  public Forder addSorder(Forder forder, Product product);  //把商品数据转化为购物项  public Sorder productToSorder(Product product);
}  //ForderService接口
public interface ForderService extends BaseService<Forder> {  //计算购物总价格  public double cluTotal(Forder forder);
}  

然后我们具体实现这两个接口:

//SorderServiceImpl实现类
@Service("sorderService")
public class SorderServiceImpl extends BaseServiceImpl<Sorder>  implements SorderService{@Overridepublic Forder addForder(Forder forder, Product product) {boolean isHave=false;//用来标记有没有重复购物项//拿到当前购物项Sorder sorder=productToSorder(product);//判断当前购物项 是否重复 如果重复 则添加数量就好for (Sorder old : forder.getSorders()) {if(old.getProduct().getId().equals(sorder.getProduct().getId())){//购物项有重复,则添加数量即可old.setNumber(old.getNumber()+sorder.getNumber());isHave=true;break;}}//当前购物项在购物车中不存在,新添加即可if(!isHave){//我们在这里插入一句://在向购物中添加购物项之前,先建立购物项与购物车的关联,但是此时forder.id为null//但是在入库的时候是先入库购物车,再入购物项那时候就有主键了
            sorder.setForder(forder);forder.getSorders().add(sorder);}return forder;}@Overridepublic Sorder productToSorder(Product product) {Sorder sorder=new Sorder();sorder.setName(product.getName());sorder.setNumber(1);sorder.setPrice(product.getPrice());sorder.setProduct(product);return sorder;}}//ForderServiceImpl实现类
@Service("forderService")
public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService {@Overridepublic BigDecimal cluTotal(Forder forder) {BigDecimal total = new BigDecimal(0.00);for(Sorder sorder:forder.getSorders()){total=total.add(sorder.getPrice().multiply(new BigDecimal(sorder.getNumber())));}return total;}}

然后我们需要将这两个bean注入到BaseAction中,供SorderAction使用:

@Controller("baseAction")
@Scope("prototype")
public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> {  //省略其他无关代码……
  @Resource  protected ForderService forderService;  @Resource  protected SorderService sorderService;  }  

好了,Service层的逻辑做完了,接下来准备做Action部分:

2.2 Action部分的逻辑

我们新建一个SorderAction,将上面的逻辑图上显示的流程走一遍即可完成添加购物车的逻辑了。代码如下:

@Controller
@Scope("prototype")
public class SorderAction extends BaseAction<Sorder> {  public String addSorder() {  //1. 根据product.id获取相应的商品数据  Product product = productService.get(model.getProduct().getId());  //2. 判断当前session是否有购物车,如果没有则创建  if(session.get("forder") == null) {  //创建新的购物车,存储到session中  session.put("forder", new Forder(new HashSet<Sorder>()));  }   //3. 把商品信息转化为sorder,并且添加到购物车中(判断购物项是否重复)  Forder forder = (Forder) session.get("forder");  forder = sorderService.addSorder(forder, product);  //4. 计算购物的总价格
        forder.setTotal(forderService.cluTotal(forder));  //5. 把新的购物车存储到session中  session.put("forder", forder);  return "showCart";  }
}  

配置一下struts.xml文件:

<action name="sorder_*" class="sorderAction" method="{1}">  <result name="showCart">/showCart.jsp</result>
</action>  

然后跳转到购物车显示页面showCart.jsp,showCart.jsp中关于购物车部分的前台程序如下:

3. 前台链接的跳转

后台部分全部做完了,接下来将前台detail.jsp页面添加购物车的链接地址该成访问SorderAction即可:

这样就能正确跳转了,下面我们看一下购物车显示页面的具体效果:

这样我们购物车的基本功能就做完了,后面我们再对其做一些完善。

【SSH网上商城项目实战17】购物车基本功能的实现相关推荐

  1. 【SSH网上商城项目实战】之环境搭建填坑

    此篇主要是记录我在从零开始走一遍倪升武大神的[SSH网上商城项目实战]过程中遇到的一些坑并记录解决方法.关于这个项目,大家可以去倪升武的博客学习了解,SSH网上商城项目实战请戳倪升武的项目实战专题. ...

  2. 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

    转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...

  3. 【SSH网上商城项目实战21】从Demo中看易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的AP ...

  4. 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2

    转自:https://blog.csdn.net/eson_15/article/details/51277324 今天开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总 ...

  5. 【SSH网上商城项目实战20】在线支付平台的介绍

    之前已经完成了首页的显示,用户添加购物车,确认订单等功能,下面就是支付功能的开发了.用户确认了订单后会直接跳转到支付页面进行在线支付,在线支付需要第三方的接口,这一节主要介绍一些关于第三方支付的内容, ...

  6. 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架

    转自:https://blog.csdn.net/eson_15/article/details/51312490 前面两节,我们整合了SSH并且抽取了service和action部分的接口,可以说基 ...

  7. 【SSH网上商城项目实战23】完成在线支付功能

    转自:https://blog.csdn.net/eson_15/article/details/51464415 上一节我们做好了支付页面的显示,从上一节支付页面显示的jsp代码中可以看出,当用户点 ...

  8. 【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题

    购物车这一块还剩最后两个问题,就是订单信息的级联入库和页面缓存,这里的信息是指购物车和购物项,即我们将购物车的信息存入数据库的同时,也存入每个购物项的信息,而且外键都关联好,这涉及到了Hibernat ...

  9. 【SSH网上商城项目实战18】过滤器实现购物登录功能的判断

    转自:https://blog.csdn.net/eson_15/article/details/51425010 上一节我们做完了购物车的基本操作,但是有个问题是:当用户点击结算时,我们应该做一个登 ...

最新文章

  1. if...else 小练习
  2. mysql所有的编码_MySQL 批量修改数据表编码及字符集
  3. C++之类型萃取技巧
  4. struts1,struts2,springMVC对比
  5. 使用Spring Security添加RememberMe身份验证
  6. [博客..配置?]博客园美化
  7. git 上传项目到linux仓库_总结:上传python项目至git上前的一些准备工作
  8. 不在gopath目录下能使用godoc吗_一文搞懂 Go Modules 前世今生及入门使用
  9. 智能擦窗机器人的社会意义_告别传统清扫方式 AWE玻妞展示擦窗机器人
  10. 解决打印机问题的方法
  11. 使用IIS Live Smooth Streaming技术搭建流媒体直播系统
  12. 微信公众号的黑色商业链揭秘
  13. 阿里无影云电脑 试用评测
  14. java 统计数字个数_JAVA统计数字个数
  15. 如何购买华为服务器+云计算特点
  16. JS基础-循环精灵图
  17. 植物神经紊乱,适量进食米饭有什么好处?
  18. JVM 垃圾收集器 学习笔记(《深入理解java虚拟机》之六 垃圾收集)
  19. 对比Google翻译、百度翻译和有道翻译
  20. 【大数据】9大实战项目解决你所有烦恼(写论文、找工作)

热门文章

  1. 嵌入式linux开发中常见的虚拟机和主机的文件共享问题
  2. CoverageMeter中关于“line coverage”不准确的解释
  3. 心流:最优体验心理学
  4. 被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变
  5. maven引入本地jar包
  6. onsubmit阻止表单提交
  7. CISCO路由器安全配置
  8. 从原理来看Silverlight 4的架构
  9. CSS5:移动端页面(响应式)
  10. Intel不挤牙膏了!10nm性能参数公布:提升43%