重复提交产生的情景

异步情况(非阻塞情况):
       根据测试结果,form提交默认是异步的,当然了异步的肯定是非阻塞的,按钮一直处于可点击状态,点击多次按钮就会提交多次请求,即使后台让每个请求都sleep 9秒。
        第一次点击后,按钮仍然是可点击状态,第二次点击产生的请求会立刻进入后台。

总结:非阻塞情况下(异步情况下),肯定会存在重复提交的问题。

同步情况(阻塞情况):
       阻塞情况下,比如ajax的阻塞,ajax的阻塞也就是ajax的同步,点击多次也会提交多次。
       点击第一次后,按钮变得不可点击,第二次点击,请求不会立刻到后台,而是等待后台产生响应后,第二次点击的请求才会到后台。
总结:阻塞情况下(同步情况下),肯定会存在重复提交的问题。

样例代码:
repeat.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%String contextPath = request.getContextPath(); %>
<html>
<body>
<h2>Hello World!</h2>

<form action="<%=contextPath %>/repeat/hello" method="get">
      <input type="submit" value="默认提交" >
      
      <input type="button" value="ajax阻塞提交" onclick="submitFunc()" >
     </form>
     
     <script type="text/javascript">
     
     var xmlhttp;
     if (window.XMLHttpRequest)
       {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
       }
     else
       {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
       }
     
    
     
     function submitFunc(){
     xmlhttp.open("GET","<%=contextPath %>/repeat/hello",false);
    xmlhttp.send();
     }
     </script>
</body>
</html>

RepeatServlet.java
package test_maven;


import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RepeatServlet extends HttpServlet {


/**    
 * serialVersionUID:TODO(用一句话描述这个变量表示什么)    
 *    
 * @since Ver 1.1    
 */    

private static final long serialVersionUID = 1L;


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

System.out.println(Thread.currentThread().getName()+" 进入doGet.....");

//sleep 9s
try {
Thread.sleep(9000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 离开doGet.....");
super.doGet(req, resp);
}

}
web.xml
<servlet>
  <description>test 重复提交的servlet</description>
  <servlet-name>RepeatServlet</servlet-name>
  <servlet-class>test_maven.RepeatServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>RepeatServlet</servlet-name>
  <url-pattern>/repeat/hello</url-pattern>
  </servlet-mapping>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值