在做基于SSH的web应用的时候通常会遇到这样一种情况:我们在页面上的数据列表中删除一条数据,然后刷新一次当前页面hibernate会报一个异常:找不到对象 这是因为在第一次点击删除链接的时候已经将那条数据删除了,此时你可以在页面上单击右键-->属性 查看一下当前的链接它会是刚才你删除数据时候的链接例如:http://localhost/xxxx/org!del.action?pid=7 所以在这个时候如果你刷新一下当前页面就会把上一步的操作再次的执行一次 因为刚才的那一条数据已经删除了所以当然会因为找不到对象而报错 对此有两种解决方案:
(1)我们在列表中删除一条数据的时候,显示效果一般是一条数据删除完成后还会跳转到当前页面:这种跳转是forward跳转地址栏不会发生变化。所以刷新页面仍然会再次的提交请求。所以我们可以把这种forward跳转改成redirect跳转,这样地址就发生变化不会出现错误了
(2)因为删除操作是在当前页面进行的而且地址没有变,所以刷新会出问题,我们可以利用javascript在点击删除链接的时候打开一个模态的窗口,在这个窗口中删除,删除完成之后刷新一下列表页面就可以了,这样就阻止了用户的刷新页面操作。
(1)我们在列表中删除一条数据的时候,显示效果一般是一条数据删除完成后还会跳转到当前页面:这种跳转是forward跳转地址栏不会发生变化。所以刷新页面仍然会再次的提交请求。所以我们可以把这种forward跳转改成redirect跳转,这样地址就发生变化不会出现错误了
public String del() {
this.orgService.del(org.getId());
return "del_success";
}
<!--org.action默认执行execute()方法,传递参数pid是因为列表是一棵树有多级目录要做到在哪一级目录下面删除的还要跳转到哪一级目录下面才可以 -->
<result name="del_success">/org.action?pid=${pid}</result>
public String execute() {
List<Organization> orgs = this.orgService.search(pid);
ActionContext.getContext().put("orgs", orgs);
return index;
}
(2)因为删除操作是在当前页面进行的而且地址没有变,所以刷新会出问题,我们可以利用javascript在点击删除链接的时候打开一个模态的窗口,在这个窗口中删除,删除完成之后刷新一下列表页面就可以了,这样就阻止了用户的刷新页面操作。
<td align="center" vAlign="center"><a href="javascript:del('org!del.action?id=<s:property value="id"/>','确实删除记录?')">删除</a></td>
function openDeleteDialog(url,confirmString){
var c = confirmString;
if(c == null || c == ''){
c = "你确认要删除记录吗?";
}
if(confirm(c)){
return window.showModalDialog(url,"window123","dialogHeight:234px;dialogWidth:271px;resizable:no;help:yes;status:no;scroll:no");
}
return false;
}
/*
* 删除记录
*/
function del(url,info){
if(openDeleteDialog(url,info)){
window.location.reload(true);
}
}