刷新页面重复提交问题的解决,及其衍生的思考

本文记录了一个javaweb商城中遇到的购物车重复提交数据问题的解决过程。在用户增加商品数量后刷新页面导致数据重复提交,通过分析入口和出口,设置操作值判断入口来源,避免了重复提交。同时,对数据回路的高效传递进行了讨论。

背景及简单的介绍

由于没有截图保存下来,所以这篇博客可能有点不生动,这是几天后进行回顾时写的记录,主要记录这次问题解决的过程,及一些漫谈思考

问题描述

写一个javaweb的网上商城,在购物车里对商品的数量增加一个,数据到数据库后,又返回了这个页面,形成了数据由页面到后端又返回此页面显示商品数量的一个回路。
暂且不提购物车里的数据在此时是否应该直接拿到数据库,还是一次次数量加一后,再一起拿到数据库,因为都会在刷新此页面的时候重复提交数据到后端,因此这个问题成了一个致命的bug,急需处理

处理过程

使用的环境

MVC三层开发,即模型、视图、控制器三层
页面视图层是jsp写的,然后传到servlet(控制层),servlet调用模型层的类写入数据库

首先,空指针

在这之前,是由于遇到了几个空指针的bug要处理,然后才引入了这次重复提交数据的问题的解决。

接着,还原案发现场

解决了空指针后,发现原来这个数据由页面前端到后端再回来的这个回路里,有几个入口和出口,然后才是这个回路。
进入查看我的购物车界面之前要通过控制层的servlet调用,然后将查出来的数据库的数据返回给页面

进入这个servlet的入口有两个:

入口1、在商品详情页面将商品加入购物车后,直接跳转到servlet,此时没有点击购物车里的商品数量加一件按钮,加一件的这个操作的数据没有传入servlet
入口2、在购物车页面点击商品数量加一按钮增加一件商品时,也是进入的这个servlet,其实这个可以进专门处理将数量加一的过程的servlet,但是还是要返到查看我的购物车的上面那个servlet

从这个servlet出来的时候,带着加一件后的数据来的

出口1、出servlet后返到查看我的购物车界面
出口2、跳转到别的相应的功能servlet或界面

处理

分清了入口和出口,就好操作了,从入口2进servlet时会带进点击加一件按钮这个操作的操作值,而入口1没有,那就在servlet里接收这个操作值,并给一个初始值空,为空则是入口1,有操作值则是入口2,入口2进来后出servlet时要将这个操作值再次初始化为空,然后到购物车页面后,将加一件按钮的属性值写成空(即接收出servlet被初始化空的操作值),这样就表示是入口2进入servlet加一件到数据库后,出servlet时又查看我的购物车页面上的加一件按钮的属性改成没有使用过了(即空值),这样刷新页面就不会再提交数据到servlet进而加到数据库了,除非你又点击了加一件按钮,这时按钮的属性值由空变为非空的值,传到servlet,出servlet时又被servlet初始化为空传到页面按钮的属性里,就结束了这一次加一件这个操作,而刷新不会提交了

结束及总结

到此问题就解决了,我觉得这样解决时数据在回路中的传递效率还挺高。
其实还有好多展开的思路及后续的拓展,那就先未完待续吧。。。有时间了再来补上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值