【SSH网上商城项目实战17】购物车基本功能的实现
来源:互联网 发布:好的软件培训 编辑:程序博客网 时间:2024/04/30 11:30
目录(?)[+]
- 添加新的表
- 购物车的后台逻辑
- 1 Service层的逻辑
- 2 Action部分的逻辑
- 前台链接的跳转
上一节我们将商品的详细页面做完了,并使用了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)
- );
/*============================*//* 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);
- }
//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;
- }
- }
//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;
- }
@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”;
- }
- }
@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>
<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/column/details/str2hiberspring.html
整个项目的源码下载地址:http://blog.csdn.NET/eson_15/article/details/51479994
_____________________________________________________________________________________________________________________________________________________
—–乐于分享,共同进步!
<div id="digg" articleid="51418350"> <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();"> <dt>顶</dt> <dd>11</dd> </dl> <dl id="btnBury" class="digg digg_enable" onclick="btnburya();"> <dt>踩</dt> <dd>0</dd> </dl> </div> <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank"> </a> </div><div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </a></div><script type="text/javascript"> function btndigga() { $(".tracking-ad[data-mod='popu_222'] a").click(); } function btnburya() { $(".tracking-ad[data-mod='popu_223'] a").click(); } </script>
- 上一篇web中session与序列化的问题
- 下一篇【SSH网上商城项目实战18】过滤器实现购物登录功能的判断
<div style="clear:both; height:10px;"></div> <div class="similar_article" style=""> <h4>我的同类文章</h4> <div class="similar_c" style="margin:20px 0px 0px 0px"> <div class="similar_c_t"> <label class="similar_cur"> <span style="cursor:pointer" onclick="GetCategoryArticles('6228419','eson_15','foot','51418350');">● 项目实战<em>(29)</em></span> </label> <label class=""> <span style="cursor:pointer" onclick="GetCategoryArticles('6214186','eson_15','foot','51418350');">------【SSH网上商城】<em>(29)</em></span> </label> </div> <div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;"> <a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a> <ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51506334" id="foot_aritcle_51506334undefined07923260436447199" target="_blank" title="【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表">【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表</a><span>2016-05-26</span><label><i>阅读</i><b>6059</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51484247" id="foot_aritcle_51484247undefined4768835685464923" target="_blank" title="【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布">【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布</a><span>2016-05-23</span><label><i>阅读</i><b>13823</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475431" id="foot_aritcle_51475431undefined24466559284061407" target="_blank" title="【SSH网上商城项目实战26】完成订单支付后的短信发送功能">【SSH网上商城项目实战26】完成订单支付后的短信发送功能</a><span>2016-05-22</span><label><i>阅读</i><b>4704</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51465067" id="foot_aritcle_51465067undefined005530096470807377" target="_blank" title="【SSH网上商城项目实战24】Struts2中如何处理多个Model请求">【SSH网上商城项目实战24】Struts2中如何处理多个Model请求</a><span>2016-05-21</span><label><i>阅读</i><b>4245</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51452243" id="foot_aritcle_51452243undefined0062675089359605085" target="_blank" title="【SSH网上商城项目实战22】获取银行图标以及支付页面的显示">【SSH网上商城项目实战22】获取银行图标以及支付页面的显示</a><span>2016-05-19</span><label><i>阅读</i><b>3742</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51441431" id="foot_aritcle_51441431undefined820387173455515" target="_blank" title="【SSH网上商城项目实战20】在线支付平台的介绍">【SSH网上商城项目实战20】在线支付平台的介绍</a><span>2016-05-18</span><label><i>阅读</i><b>4107</b></label></li> </ul> <ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51487323" id="foot_aritcle_51487323undefined8876969164530883" target="_blank" title="【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价">【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价</a><span>2016-05-24</span><label><i>阅读</i><b>5337</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51479994" id="foot_aritcle_51479994undefined5001572471017519" target="_blank" title="【SSH网上商城项目实战30】项目总结(附源码下载地址)">【SSH网上商城项目实战30】项目总结(附源码下载地址)</a><span>2016-05-27</span><label><i>阅读</i><b>21890</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51475046" id="foot_aritcle_51475046undefined9184912825972149" target="_blank" title="【SSH网上商城项目实战25】使用java email给用户发送邮件">【SSH网上商城项目实战25】使用java email给用户发送邮件</a><span>2016-05-22</span><label><i>阅读</i><b>4007</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51464415" id="foot_aritcle_51464415undefined3111782963392702" target="_blank" title="【SSH网上商城项目实战23】完成在线支付功能">【SSH网上商城项目实战23】完成在线支付功能</a><span>2016-05-20</span><label><i>阅读</i><b>8822</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/eson_15/article/details/51447492" id="foot_aritcle_51447492undefined24922161472174964" target="_blank" title="【SSH网上商城项目实战21】从Demo中看易宝支付的流程">【SSH网上商城项目实战21】从Demo中看易宝支付的流程</a><span>2016-05-18</span><label><i>阅读</i><b>9653</b></label></li> </ul> <a href="http://blog.csdn.net/eson_15/article/category/6228419" class="MoreArticle">更多文章</a></div> </div> </div> <script type="text/javascript"> $(function () { GetCategoryArticles('6228419', 'eson_15','foot','51418350'); });</script>
- 【SSH网上商城项目实战17】购物车基本功能的实现
- 【SSH网上商城项目实战17】购物车基本功能的实现
- SSH网上商城项目实战 过滤器实现购物车购物登陆功能的判断。
- 【SSH网上商城项目实战18】过滤器实现购物登录功能的判断
- 【SSH网上商城项目实战18】过滤器实现购物登录功能的判断
- 【SSH网上商城项目实战04】EasyUI菜单的实现
- 【SSH网上商城项目实战04】EasyUI菜单的实现
- 【SSH网上商城项目实战04】EasyUI菜单的实现
- 网上商城购物车的实现
- 【SSH网上商城项目实战13】Struts2实现文件上传功能
- 【SSH网上商城项目实战13】Struts2实现文件上传功能
- 【SSH网上商城项目实战13】Struts2实现文件上传功能
- 【SSH网上商城项目实战08】查询和删除商品类别功能的实现
- 【SSH网上商城项目实战09】添加和更新商品类别功能的实现
- 【SSH网上商城项目实战11】查询和删除商品功能的实现
- 【SSH网上商城项目实战12】添加和更新商品功能的实现
- 【SSH网上商城项目实战08】查询和删除商品类别功能的实现
- 【SSH网上商城项目实战09】添加和更新商品类别功能的实现
- Centos7 安装配置OpenLdap服务及OpenLdap管理工具
- unity—对话的设计
- JNDI配置数据源dbcp方式,配置文件加密
- 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
- 以太网和令牌环网的区别
- 【SSH网上商城项目实战17】购物车基本功能的实现
- 蓝牙设备的连接
- iOS如何往当前工程再添加一个工程
- git 简介及常用命令
- android 开发零起步学习笔记(二十五):Android layout属性大全
- 【SSH网上商城项目实战18】过滤器实现购物登录功能的判断
- 1 那些年遇到过的面试题 - 40个多线程问题总结
- Web.xml配置详解之context-param
- 解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5