用JavaScript执行Struts2和奇怪的动作

时间:2018-10-15 15:22:53

标签: javascript struts2

我有一个非常旧的应用程序要维护,它的背后是Struts和常规的Java(没有Spring的东西)。 当我引入一个新页面时,我注意到由Java脚本运行的动作执行不正确,是指以下脚本:

<script language="javascript">
    function addButtonClick(button) {
        var $suaName = $(button).closest("tr").find(".suaName").text();
        var $suaMobileNo = $(button).closest("tr").find(".suaMobileNo").text();
        $.post('viewSmsAccessCode!add.action', {name: $suaName, mobileNo: $suaMobileNo});
        window.location.href=createSmsAccessCode.action;
    }
</script>

首先执行最后一行(重定向到另一个操作),然后执行“ viewSmsAccessCode!add.action”。

通过这种方式,我的页面失去了同步,新页面始终显示以前选择的记录。上面的脚本是通过单击按钮执行的(每行在DataTable中都有其按钮。

<button class="formButton" onclick="addButtonClick(this)">Add</button>

即使我将最后一行移到一个单独的脚本中并这样称呼它们,也会发生这种情况:

<button class="formButton" onclick="addButtonClick(this);redirect('createSmsAccessCode.action')">Add</button>

Actions扩展了ActionSupport类并实现了一个或多个此接口:SessionAware,ServletRequestAware,Preparable

我真的不明白,那怎么可能?什么可能导致这种行为?

或者我如何以同步方式将我的javascript检索的参数传递给新操作?

1 个答案:

答案 0 :(得分:-1)

因为实际上没有答案,所以我决定自己回答,以防其他人遇到类似的问题。

由于其异步特性,对此类事情使用javascript或JQuery并不是一个好主意。更好的办法是坚持高举行动,并采取行动。最初,我决定使用javascript,因为我不知道如何确定要单击哪个按钮(表行)。但是根本没有必要。与其呈现整个表格内部的表格,不如为每一行生成单独的表格,这样就不再需要查找被单击的行,就像这样:

<tbody>
        <s:iterator value="accessList" status="status" var="row">
            <tr>
              <s:form action="viewSmsAccessCode">
                <td class="suaName"><s:property value="suaName"/><s:hidden name="suaName" value="%{suaName}"/></td>
                <td class="suaMobileNo"><s:property value="suaMobileNo"/><s:hidden name="suaMobileNo" value="%{suaMobileNo}"/></td>
                <td><s:property value="suaActionList"/></td>
                <td style="width: fit-content">
                  <span>
                    <s:submit action="createSmsAccessCode" class="formButton" value="Add"/>
                    <s:submit action="deleteSmsAccessCode" class="formButton" value="Delete"/>
                  </span>
                </td>
              </s:form>
            </tr>
        </s:iterator>
</tbody>

现在获取详细信息页面的参数不需要任何进一步的步骤,父操作只需要声明两个变量,就不需要使用任何JavaScript。

这就是我一直在问的“替代方式”。