Struts2 和 javascript 执行的奇怪动作
Struts2 and weird action execution by javascript
我有一个应用程序要维护,非常旧,在后面使用 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 class 并实现了一个或多个接口:SessionAware、ServletRequestAware、Preparable
真不明白,这怎么可能?什么可能会导致这种行为?
或者,如何将我的 java 脚本检索到的参数以同步方式传递给新操作?
由于实际上没有答案,我决定自己回答,以防其他人遇到类似的问题。
使用 javascript 或更确切地说 JQuery 来处理这种事情并不是一个好主意,因为它具有异步特性。更好的方法是坚持 struts 行动以及可以用它们做什么。最初我决定使用 javascript 因为我不知道如何确定哪个按钮(table 行)被点击。然而,这是完全没有必要的。与其呈现包含整个 table 的表单,不如为每一行生成单独的表单,这样就不再需要查找被单击的行,如下所示:
<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>
现在获取详情页面的参数不需要任何步骤,parent action只需要声明两个变量,完全不涉及javascript。
这就是我一直在问的"alternative way"。
我有一个应用程序要维护,非常旧,在后面使用 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 class 并实现了一个或多个接口:SessionAware、ServletRequestAware、Preparable
真不明白,这怎么可能?什么可能会导致这种行为?
或者,如何将我的 java 脚本检索到的参数以同步方式传递给新操作?
由于实际上没有答案,我决定自己回答,以防其他人遇到类似的问题。
使用 javascript 或更确切地说 JQuery 来处理这种事情并不是一个好主意,因为它具有异步特性。更好的方法是坚持 struts 行动以及可以用它们做什么。最初我决定使用 javascript 因为我不知道如何确定哪个按钮(table 行)被点击。然而,这是完全没有必要的。与其呈现包含整个 table 的表单,不如为每一行生成单独的表单,这样就不再需要查找被单击的行,如下所示:
<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>
现在获取详情页面的参数不需要任何步骤,parent action只需要声明两个变量,完全不涉及javascript。
这就是我一直在问的"alternative way"。