当前位置: 代码迷 >> J2EE >> 执行action之后跳转,然后刷新则又执行了一次action的诡异有关问题
  详细解决方案

执行action之后跳转,然后刷新则又执行了一次action的诡异有关问题

热度:103   发布时间:2016-04-22 01:03:48.0
执行action之后跳转,然后刷新则又执行了一次action的诡异问题。
删除的action如下:
Java code
public String deleteAthleteSignup1() throws Exception {        try {            // 删除athlete里面的countNumber            athleteSignup = this.athleteSignupService.findById(id);            // athlete = athleteService.findById(aid);            athlete = athleteSignup.getAthlete();            athlete.setCountNumber(athlete.getCountNumber() - 1);            // 删除team里面的countNumber            team = athleteSignup.getEvent().getTeam();            team.setCountNumber(team.getCountNumber() - 1);            this.athleteSignupService.updateAthleteSignup(athleteSignup);            this.athleteSignupService.deleteAthleteSignup(id);            listAthleteSignup = this.athleteSignupService.findByAthleteId(aid);        } catch (Exception e) {            e.printStackTrace();            return INPUT;        }        return SUCCESS;    }

配置文件如下:
XML code
<action name="athleteSignupDeleteBy" class="athleteSignupAction"            method="deleteAthleteSignup1">            <result name="success">/web/athleteSignup/findByAthleteId.jsp            </result>            <result name="input">/web/athleteSignup/deleteError.jsp</result>        </action>


删除之后,返回,数据是删除了。返回的也正常,因为action里面有个listAthleteSignup 页面自然就可以读取了。
但是,为什么删除action执行之后,跳转了,到这里都一切正常!但是,我再刷新一次的时候,他又执行了一次刚才的删除action,所以就导致页面报错了。请问是为啥呢?

但是另外一种写法:
Java code
<action name="saveEventBatch" class="com.yaxing.action.EventAction"            method="saveEventBatch">            <result name="success" type="redirectAction">                <param name="actionName">event/findByTeam.action</param>                <param name="id">${session.userId}</param>                <param name="fullName">${fullName}</param>            </result>            <result name="input">/web/event/error.jsp</result>        </action>

这样执行之后,再刷新是没的问题的。很纠结呢。谢谢。

------解决方案--------------------
刷新相当于重新提交数据,当然会重新执行一次删除。

如果要避免重新提交数据,一般是三种做法:
1、删除动作是弹出页面执行的(没东西让用户刷新了);
2、删除成功后做页面跳转(必须是浏览器端页面跳转,不能是服务器端的forward);
3、用Ajax提交删除动作(刷新并不管Ajax提交的东西)。


------解决方案--------------------
token防止用户重复提交表单
1.在<from>下添加<s:token></s:token>
2.在struts2中添加
<interceptor-ref name="token"></interceptor-ref>--添加拦截器
<result name="invalid.token">/admin/token.jsp</result>--添加拦截到时跳转的页面
------解决方案--------------------
探讨

恩,我改成redirectAction 就可以了。引用:
刷新相当于重新提交数据,当然会重新执行一次删除。

如果要避免重新提交数据,一般是三种做法:
1、删除动作是弹出页面执行的(没东西让用户刷新了);
2、删除成功后做页面跳转(必须是浏览器端页面跳转,不能是服务器端的forward);
3、用Ajax提交删除动作(刷新并不管Ajax提交的东西)。

------解决方案--------------------
加redirect后url重定向了,就是说地址栏地址变了。
不加redirect,跳转后地址不变的,所以刷新会再次提交。
  相关解决方案