我知道这里有过多次询问,但我想要一些意见。
我正在处理的网络应用程序通过Freemarker显示数据库中的表格。它包括一个提交按钮,用于删除该数据库中的条目。该按钮适用于发送请求,但我想让它自动刷新页面,以显示没有该条目的新表。我试过这个:
<form onsubmit="location.reload()" method="post" action="http://localhost:8080/person/delete/${profile.id};">
<input type="submit" value="Delete"></form>
和此:
<form onsubmit="location.reload()" method="post" action="http://localhost:8080/person/delete/${profile.id};">
<input type="submit" value="Delete"></form>
两者都没有任何影响。进一步的研究表明,除非forceGet设置为true,否则reload()将从缓存中刷新页面。我为这两种方法做了这个,并没有看到任何区别。然后我认为这是一个页面刷新的情况,然后才能从服务器获取更新的信息,所以我等了100毫秒:
<script>
function reloadPage() {
setTimeout(function () {
location.reload();
}, 100)
}
</script>
<form onsubmit="reloadPage()" method="post" action="http://localhost:8080/person/delete/${profile.id};">
<input type="submit" value="Delete"></form>
这有效,但我想知道是否有任何关于原始方法不起作用的见解。另外,对我的代码的替代品有任何建议吗?
编辑:
澄清路径http://localhost:8080/person/delete/ $ {profile.id};不会导致页面;它意味着调用将运行delete方法的资源类中的方法中的方法:
@POST
@Path("/delete/{id}")
public void deleteProfile(@PathParam("id") int id) {
manager.deleteProfile(id);
}
答案 0 :(得分:1)
我不确定为什么你的代码有效,它不应该。提交表单时,它实际上会将您重定向到action
中指定的URL,因此无法同时重新加载和重定向。
我的建议是使用http请求删除数据。这看起来像这样:
<script>
function deleteData(var id) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
location.reload(); // request successfull, so reload
}
xmlHttp.open( "GET", "http://localhost:8080/person/delete/"+id, true );
xmlHttp.send( null );
}
</script>
<button onclick="deleteData(${profile.id})">Delete</button>
或者,您可以使用表单(不使用reloadPage())并将http://localhost:8080/person/delete/xy处的页面重定向回此站点。
答案 1 :(得分:1)
因为在运行操作之前调用onsubmit。流程就是这个:
所以发生了什么:
由于您正在重新加载页面,因此永远不会达到操作,因此会停止所有页面逻辑。就像关闭程序并再次打开它一样。
你的100毫秒是一个肮脏的解决方法,因为它适用于你,它可能不适用于那些在100毫秒之前无法处理动作的人。想象一下,设备速度慢,网络速度慢或速度慢,会导致动作延迟超过100毫秒。它将在操作运行之前重新加载页面。
我不明白为什么你不让网页为你重新加载。自然形式提交将您带到操作URL,加载它,因此如果是相同的URL,则重新加载页面。