异步情况(非阻塞情况):
根据测试结果,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.javapackage 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>