【问题标题】:Action class is called twice动作类被调用两次
【发布时间】:2015-08-03 16:44:40
【问题描述】:

我一直在处理这种情况。在我的 Struts 2 应用程序中,我使用 AJAX 调用将字符串数组发送到 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>

【问题讨论】:

  • 删除该行就完成了。
  • $('#finish') 是什么?提交?
  • @RomanC:我已经尝试过了。如果我删除window.location = "C.action",则正确调用动作(并且动作C 只会被调用一次),但不会呈现page_2.jsp。 @DaveNewton:#finish 是一个按钮,但不是提交按钮(我在 JSP 页面中没有表单):&lt;button class="ink-button double-vertical-space all-25 dynamicButton" id="finish" disabled&gt; Finish &lt;/button&gt;
  • @jaff 应该已经在第一次调用时渲染了。

标签: java ajax jsp struts2 action


【解决方案1】:

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

用户运行 AJAX 调用,然后开始处理其他事情,并且在未保存的工作中...... PUFFF!页面更改,因为 AJAX 响应回来了。

那会很奇怪,非常烦人,并且明显违反了POLA

顺便说一句,如果您出于某种我现在无法想象的原因仍想以 AJAX 方式进行操作,那么您可以通过两种方式进行操作:

  1. 如果你想绘制 page_2.jsp,看起来,然后返回一个dispatcher 结果(或stream,或json,或任何不是@ 987654328@ 或 redirectAction) 来自您的 Action.B,那么您的 window.location = "C.action"; 将以正确的(非 AJAX)方式调用 Action.C

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

【讨论】:

  • 我理解你的疑问。我只是使用 AJAX,因为我需要将一个字符串数组 (fids) 发送到 Action 类 (A),这是我知道的唯一方法。我想存在更合适的解决方案,我只是不知道,所以如果您认为有更好的方法可以做到这一点,请随时指出。
  • @jaff:创建一个表单并提交怎么样?
  • @jaff 然后看这里:stackoverflow.com/a/15343980/1654265 我想这是你唯一缺少的东西
  • 事实上(从上面的代码中可以看出),fids 包含在按下#finish 时选中的复选框的 ID。我已经删除了 AJAX 调用,添加了一个表单并将 #finish 变成了一个提交按钮,但是虽然我之前使用过 status 参数,但我似乎无法重现我最初所做的事情(使用AJAX 调用)。由于 cmets 无法正确处理代码,如果您愿意,我可以编辑问题并尽我所能 - 但也许这离题了?无论如何,我想这是另一个 XY 问题的例子:\
  • ,
猜你喜欢
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多