《研磨struts2》第十七章 防止重复提交 之 17.1 什么是重复提交

17.1  什么是重复提交

所谓重复提交,就是用户在页面多次点击提交按钮,或者通过不断刷新页面,把已经提交过的数据多次向后台提交。

重复提交对于查询类的功能,问题还不是太大,但是对于新增或是修改类的功能,就有可能凭空的出现很多同样信息的重复数据,从而导致业务功能出现错误。

用一个实例来让大家体会一下重复提交的问题,来实现一个订单新增的功能,订单号一般都是由后台自动生成,前台页面只要传递订购人、订购商品和订购数量等订单的具体信息过来就可以了。为了示例的简洁,只是从前台传递一个订购的商品和一个订购的数量,一共两个值就可以了,就不去处理什么订单的主记录、子记录等复杂的功能了。

1:实现Action

写一个处理订单的Action,接收前台传递过来的数据,然后输出即可。为了表示会花一定的时间来进行业务处理,在execute方法里面,让线程休息6秒,示例代码如下:

 

java代码:
  1. public class TokenAction extends ActionSupport{  
  2.     private String productId;  
  3.     private int orderNum;  
  4.       
  5.     public String getProductId() {  
  6.         return productId;  
  7.     }  
  8.     public void setProductId(String productId) {  
  9.         this.productId = productId;  
  10.     }  
  11.     public int getOrderNum() {  
  12.         return orderNum;  
  13.     }  
  14.     public void setOrderNum(int orderNum) {  
  15.         this.orderNum = orderNum;  
  16.     }  
  17.     public String execute() throws Exception {  
  18.         System.out.println("预定的产品编号是:"+this.productId+",预定数量为:"+this.orderNum);   
  19.         Thread.sleep(6000L);  
  20.         System.out.println("处理完成!");  
  21.         return SUCCESS;  
  22.     }  
  23. }  

2:配置Action

在struts.xml中配置Action,示例如下:

 

java代码:
  1. <package name="helloworld" extends="struts-default">  
  2.     <action name="tokenAction" class="cn.javass.token.TokenAction">  
  3.         <result>/token/list.jsp</result>  
  4.     </action>  
  5. </package>  

 

扫描二维码关注公众号,回复: 696949 查看本文章
java代码:
  1. 3:制作新增页面  
  2. 提供新增页面来让用户输入:预定的产品编号和预定的数量,然后提交到上面的Action,示例代码如下:  

 

java代码:
  1. <%@ page language="java" contentType="text/html; charset=gb2312"  
  2.     pageEncoding="gb2312"%>  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  6. <title>Insert title here</title>  
  7. </head>  
  8. <body>  
  9. <%@ taglib prefix="s" uri="/struts-tags"%>  
  10. <s:form action="/tokenAction.action" method="post">  
  11.     <s:textfield name="productId" label="预定的产品编号"/>  
  12.     <s:textfield name="orderNum" label="预定的数量"/>  
  13.     <s:submit value="提交"/>  
  14. </s:form>  
  15. </body>  
  16. </html>  

4:运行测试

运行新增页面,填写数据,然后点击提交。由于Action中,让当前线程sleep了6秒钟,所以必须等6秒之后才能正确的结束调用。

如果这个时候用户乖乖的等足6秒,自然没有什么问题。但是,如果用户在第一次提交还没有响应的时候,又再次点击了提交按钮,则同样的请求再次被提交,这时候,如果不加任何控制的话,同样的订单就将被处理两次了。

可以在控制台中看到输出以下信息:

 

java代码:
  1. 预定的产品编号是:1,预定数量为:2  
  2. 预定的产品编号是:1,预定数量为:2  
  3. 处理完成!  
  4. 处理完成!  

很明显数据重复了,这种重复提交的问题,会给业务处理带来很多的麻烦,应该在开发中杜绝这个问题。

使用Struts2框架来进行开发的话,它已经替我们想好了应对之策,还专门为此提供了<s:token/>标签,接下来就来具体看看它的使用。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4149.html

欢迎访问http://sishuok.com获取更多内容

猜你喜欢

转载自rubbing-struts2.iteye.com/blog/1562912
今日推荐