日期:2014-05-19  浏览次数:20673 次

执行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,跳转后地址不变的,所以刷新会再次提交。