17.1 什么是重复提交
所谓重复提交,就是用户在页面多次点击提交按钮,或者通过不断刷新页面,把已经提交过的数据多次向后台提交。
重复提交对于查询类的功能,问题还不是太大,但是对于新增或是修改类的功能,就有可能凭空的出现很多同样信息的重复数据,从而导致业务功能出现错误。
用一个实例来让大家体会一下重复提交的问题,来实现一个订单新增的功能,订单号一般都是由后台自动生成,前台页面只要传递订购人、订购商品和订购数量等订单的具体信息过来就可以了。为了示例的简洁,只是从前台传递一个订购的商品和一个订购的数量,一共两个值就可以了,就不去处理什么订单的主记录、子记录等复杂的功能了。
1:实现Action
写一个处理订单的Action,接收前台传递过来的数据,然后输出即可。为了表示会花一定的时间来进行业务处理,在execute方法里面,让线程休息6秒,示例代码如下:
java代码:
- public class TokenAction extends ActionSupport{
- private String productId;
- private int orderNum;
-
- public String getProductId() {
- return productId;
- }
- public void setProductId(String productId) {
- this.productId = productId;
- }
- public int getOrderNum() {
- return orderNum;
- }
- public void setOrderNum(int orderNum) {
- this.orderNum = orderNum;
- }
- public String execute() throws Exception {
- System.out.println("预定的产品编号是:"+this.productId+",预定数量为:"+this.orderNum);
- Thread.sleep(6000L);
- System.out.println("处理完成!");
- return SUCCESS;
- }
- }
2:配置Action
在struts.xml中配置Action,示例如下:
java代码:
- <package name="helloworld" extends="struts-default">
- <action name="tokenAction" class="cn.javass.token.TokenAction">
- <result>/token/list.jsp</result>
- </action>
- </package>
java代码:
- 3:制作新增页面
- 提供新增页面来让用户输入:预定的产品编号和预定的数量,然后提交到上面的Action,示例代码如下:
java代码:
- <%@ page language="java" contentType="text/html; charset=gb2312"
- pageEncoding="gb2312"%>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
- <title>Insert title here</title>
- </head>
- <body>
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <s:form action="/tokenAction.action" method="post">
- <s:textfield name="productId" label="预定的产品编号"/>
- <s:textfield name="orderNum" label="预定的数量"/>
- <s:submit value="提交"/>
- </s:form>
- </body>
- </html>
4:运行测试
运行新增页面,填写数据,然后点击提交。由于Action中,让当前线程sleep了6秒钟,所以必须等6秒之后才能正确的结束调用。
如果这个时候用户乖乖的等足6秒,自然没有什么问题。但是,如果用户在第一次提交还没有响应的时候,又再次点击了提交按钮,则同样的请求再次被提交,这时候,如果不加任何控制的话,同样的订单就将被处理两次了。
可以在控制台中看到输出以下信息:
java代码:
- 预定的产品编号是:1,预定数量为:2
- 预定的产品编号是:1,预定数量为:2
- 处理完成!
- 处理完成!
很明显数据重复了,这种重复提交的问题,会给业务处理带来很多的麻烦,应该在开发中杜绝这个问题。
使用Struts2框架来进行开发的话,它已经替我们想好了应对之策,还专门为此提供了<s:token/>标签,接下来就来具体看看它的使用。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4149.html】
欢迎访问http://sishuok.com获取更多内容
分享到:
相关推荐
研磨Struts2
《研磨Struts2》原书配套源代码,配合Struts2原书使用,快速学习Struts2技术。
由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。
研磨struts2博文,详细讲解了struts2运行流程,值得大家阅读
《研磨Struts2》原书配套PPT,结合《研磨Struts2》配套使用,快速学习Struts2框架。
研磨Struts2 高清完整版,请和第一部分一起下载啊
《研磨Struts 2》PDF版本下载
研磨Struts2_12859679_高清完整版
研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人
研磨struts,仅是简版,我也是从网上下来的。大家凑合看吧。
第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...
第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...
第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...
第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...
研磨设计模式.part2 一定要下载5部分