SSH框架网上商城项目第17战之购物车基本功能

 更新时间:2016年06月03日 15:22:27   投稿:lijiao  
这篇文章主要为大家详细介绍了SSH框架网上商城项目第17战之购物车基本功能的实现过程,感兴趣的小伙伴们可以参考一下

上一节我们将商品的详细页面做完了,并使用了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,具体不在赘述。

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 { 
 
 @Override 
 public Forder addSorder(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.getSorders().add(sorder); 
  } 
  return forder; 
 } 
 
 @Override 
 public 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 { 
 
 @Override 
 public double cluTotal(Forder forder) { 
 
  double total = 0.0; 
  for(Sorder sorder : forder.getSorders()) { 
   total += sorder.getNumber() * sorder.getPrice(); 
  } 
  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即可:


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

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

原文地址:http://blog.csdn.net/eson_15/article/details/51418350
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解如何使用MyBatis实现数据库的CRUD

    详解如何使用MyBatis实现数据库的CRUD

    这篇文章主要为大家详细介绍了如何使用MyBatis实现数据库的CRUD操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程解析

    Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程解析

    在Mybatis中,我们需要创建一个与实体类对应的Mapper接口,然后在该接口上添加方法,这些方法对应着SQL语句,这篇文章主要介绍了Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程,需要的朋友可以参考下
    2023-11-11
  • Datagram Scoket双向通信

    Datagram Scoket双向通信

    这篇文章主要介绍了Datagram Scoket双向通信,需要的朋友可以参考下
    2014-04-04
  • 全面解读Java NIO(看这篇就够了)

    全面解读Java NIO(看这篇就够了)

    Java NIO是Java1.4之后推出来的一套IO接口,NIO提供了一种完全不同的操作方式, NIO支持面向缓冲区的、基于通道的IO操作,这篇文章主要介绍了Java NIO详解(看这篇就够了),需要的朋友可以参考下
    2023-05-05
  • Java ArrayList集合详解(Java动态数组)

    Java ArrayList集合详解(Java动态数组)

    这篇文章主要介绍了Java ArrayList集合详解(Java动态数组),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springboot2中HikariCP连接池的相关配置问题

    springboot2中HikariCP连接池的相关配置问题

    这篇文章主要介绍了springboot2中HikariCP连接池的相关配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java使用Maven BOM统一管理版本号的实现

    Java使用Maven BOM统一管理版本号的实现

    这篇文章主要介绍了Java使用Maven BOM统一管理版本号的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用java代码获取新浪微博应用的access token代码实例

    使用java代码获取新浪微博应用的access token代码实例

    这篇文章主要介绍了使用java代码获取新浪微博应用的access token实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java实现多线程下载和断点续传

    Java实现多线程下载和断点续传

    这篇文章主要为大家详细介绍了Java实现多线程下载和断点续传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 一文教你如何更改IDEA已有项目的路径/名称

    一文教你如何更改IDEA已有项目的路径/名称

    由于IDEA项目路径中有中文、空格等特殊符号,影响正常使用,想要修改路径名称,怎么正确修改IDEA项目名称,使其正常运行呢?所以本文小编讲给大家详细的介绍了更改IDEA已有项目的路径/名称解决方案,需要的朋友可以参考下
    2023-11-11

最新评论