Action类被调用两次

时间:2015-08-03 16:44:41

标签: java ajax jsp struts2 action

我一直在处理这种情况。在我的Struts 2应用程序中,我正在使用AJAX调用将String数组发送到Action类。我想做的是这样的事:page_1.jsp - > Action A - > Action B - > Action C。但是,实际发生的是page_1.jsp - > Action A - > Action B - > Action C - > Action C,即最后一个Action类被调用两次。

page_1.jsp:

<button class="ink-button double-vertical-space all-25 dynamicButton" 
           id="finish" disabled> Finish </button>

[...]

$('#finish').click(function(event)
{
    var fids = $('input:checkbox').filter(':checked').map(function ()
    {
        return this.id;
    }).get();

    $.ajax
    ({
        method: "POST",
        url: "A.action",
        data: { fids : fids },
        traditional: true,
        success:
            function()
            {
                // I know that the problem is here. 
                // Currently I have it like this, so it's understandable 
                // why action C is getting called 2 times, 
                // I just don't know how to fix it.
                window.location = "C.action"; 
            }
    });
});

struts.xml中:

<action name="A" class="action.A" method="execute">
    <result name="success" type="redirectAction"> B </result>
</action>

<action name="B" class="action.B" method="execute">
    <result name="success" type="redirectAction"> C </result>
</action>

<action name="C" class="action.C" method="execute">
    <result name="success"> /page_2.jsp </result>
</action>

1 个答案:

答案 0 :(得分:1)

你做的很奇怪。如果您想执行某些操作并转到新页面,那么为什么要使用AJAX?我想不要让用户同时工作:

  

用户运行AJAX调用,然后开始处理其他内容,并在未保存的工作中间... PUFFF!页面更改是因为AJAX响应返回。

这将是奇怪的,超级烦人且明显违反POLA

顺便说一下,如果你仍然想用AJAX方式出于某些原因我现在无法想象,那么你可以用两种方式来做:

  1. 如果您想要显示 page_2.jsp ,请返回dispatcher结果(或streamjson,或者 Action.B 中的redirectredirectAction},然后您的window.location = "C.action";会调用 Action.C 对(非AJAX)方式。

  2. 如果您想要(但似乎不是您的情况)只是反映新操作的网址,请使用history.pushState()history.replaceState()代替window.location()。他们不会触发任何请求,而URL将是新的。