我正在写一个程序,但我遇到了一个问题: 当我刷新jsp页面时,系统会自动重新提交整个页面, 我不知道如何避免它, 有人能帮助我吗?
答案 0 :(得分:20)
这是对问题的解释......
单击表单上的“提交”按钮会向Web服务器发送请求,其中包括在表单上输入的所有数据。不仅URL而且表单数据也是请求的一部分,浏览器会记住此请求。如果用户单击“刷新”,浏览器将重复该请求,再次将相同的URL 和表单数据发送到Web服务器。
但是表单可以用两种不同的方式提交,GET或POST,具体取决于“form”标签的“method”属性。有一个约定,GET请求没有副作用;它只提取数据但不对数据库进行任何更改。另一方面,如果请求更改数据,则应始终使用POST请求。正如我所说,这些只是约定,它们之间没有太大的技术差异,但一个非常重要的区别是浏览器会在用户尝试重复POST时警告用户 - 点击“刷新”会弹出一个对话框警告用户这可能导致重复操作,并确认他们确实要重新提交。刷新GET请求时,浏览器不会显示此确认信息。
您的表单是否使用了@mk所怀疑的GET方法?如果是这样,将其更改为POST是最简单的解决方案,因为这至少意味着用户在尝试刷新时会收到警告。
但更好的解决方案是@cletus提出的POST + REDIRECT + GET惯用法。这将数据库更新(POST)和视图(GET)分成两个操作。单击浏览器上的刷新然后只重复GET,它没有副作用。
答案 1 :(得分:11)
你想要的成语是:
POST + REDIRECT + GET的工作原理如下:
这样做的好处是点击重新加载不会重新提交表单。此外,如果您单击浏览器后退按钮,则不会出现“再次提交?”的提示。对话框。
以下是JSP example。
AJAX提交意味着不是将表单提交回传统意义上的服务器,而是使用表单数据创建一个返回服务器的AJAX请求。该提交做了它需要的东西。单击重新加载只会重新加载页面。它不会重新发送AJAX请求。
答案 2 :(得分:0)
请勿使用GET提交或以其他方式更改数据。请改用POST。您需要将表单更改为
<form action="test.jsp" method="get">
有关详细信息,请参阅http://www.google.com/search?q=get+post。
(你的问题也有点不清楚 - 你的意思是在浏览器或容器中刷新(例如Tomcat)?你是什么意思重新提交页面?页面没有提交,表单做。哪个系统?我猜到了你的意思,如果你有别的意思,请告诉我们。)
答案 3 :(得分:0)
如果您在服务器端使用JSP并使用控制器Servlet来控制页面方向。您只需将页面方向模式从“前进”更改为“页面重定向”即可。这样您就可以阻止表单重新提交。 this would be userful to understand it
问候!
答案 4 :(得分:0)
这是解决方案
@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
{
request.setCharacterEncoding("UTF-8");
String xxx=request.getParameter("xxx");
S
boolean result=object.method(xxx);
String message="";//reurning a messgae is sucess
if(result==true)
{
message="Data Saved successfully";
}
else
{
message="Error while saving data";
}
return (new ModelAndView(getMasterrulescreation(),"message",message));
}
else //if no value in primary key redirect fresh page
{
return (new ModelAndView(getMasterrulescreation()));
}
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
答案 5 :(得分:0)
我们可以使用Post/Redirect/Get (PRG) pattern来解决问题 多次提交相同的数据。
它的工作原理如下:
用户首次通过POST或GET向服务器提交表单时 方法,然后我们更新应用程序数据库中的状态。
然后我们发送重定向响应以向客户端发送回复。
然后我们使用GET命令加载视图。没有数据 送到这里。由于这是一个新的JSP页面,因此可以安全地使用多个页面 提交。处理请求的代码是幂等的。所以 不对同一请求执行两次相同的操作。
答案 6 :(得分:0)
使用以下脚本可以正常工作。
<script>
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
</script>