jQuery Ajax调用Struts Action后无法跳转页面的问题求助
问题分析与解决
核心问题:AJAX请求不会自动触发页面跳转。你用jQuery的ajax()请求Struts Action时,Action执行成功后返回的JSP内容会作为响应数据传递到success回调函数中,浏览器不会自动把这个内容渲染成新页面,这是AJAX的异步工作机制导致的。
你的现有代码
AJAX请求代码
$.ajax({ url: "viewResult", type:"POST", data: "TEST", contentType: "application/json; charset=utf-8", success: function(res, textStatus, jqXHR) { // 此处仅能获取返回的HTML内容,不会自动触发页面跳转 ..... } });
Struts.xml中viewResult Action原配置
<action name="viewResult" class="comparatorProject.navigator.actions.ViewResultAction" method="execute" > <result name="success" >jsp/viewResult.jsp</result> </action>
ViewResultAction.java代码
package comparatorProject.navigator.actions; import com.opensymphony.xwork2.ActionSupport; public class ViewResultAction extends ActionSupport{ private static final long serialVersionUID = 1L; public String execute() { return SUCCESS; } }
已尝试的无效配置
- 尝试1:
<action name="viewResult" class="comparatorProject.navigator.actions.ViewResultAction" method="execute" > <result name="success" type="redirect" >${url}</result> </action>
- 尝试2:
<action name="viewResult" class="comparatorProject.navigator.actions.ViewResultAction" method="execute" > <result name="success" type="dispatcher"> <param name="location">jsp/viewResult.jsp</param> </result> </action>
解决方案
根据需求场景,提供两种可行方案:
方案1:放弃AJAX,改用普通表单提交
如果不需要异步处理逻辑,直接将表单改为普通提交即可,Struts的dispatcher结果会自动完成页面跳转:
<form action="viewResult" method="post"> <!-- 表单元素 --> <button type="submit">提交</button> </form>
方案2:保留AJAX,手动处理跳转或内容渲染
如果必须使用AJAX(比如需要先完成前端表单验证),可选择以下两种方式:
方式A:Action返回跳转URL,前端JS触发跳转
- 修改Action,添加跳转URL属性及getter方法:
package comparatorProject.navigator.actions; import com.opensymphony.xwork2.ActionSupport; public class ViewResultAction extends ActionSupport{ private static final long serialVersionUID = 1L; private String redirectUrl; public String execute() { redirectUrl = "viewResult"; // 需指向Action名称,不可直接写JSP路径(受web.xml的JSP访问限制) return SUCCESS; } public String getRedirectUrl() { return redirectUrl; } }
- 修改Struts.xml,配置Action返回JSON结果:
<package name="comparatorProject" extends="struts-default,json-default" namespace="/"> <action name="viewResult" class="comparatorProject.navigator.actions.ViewResultAction" method="execute" > <result name="success" type="json"/> </action> </package>
- 修改AJAX的
success回调,手动触发页面跳转:
$.ajax({ url: "viewResult", type:"POST", data: "TEST", contentType: "application/json; charset=utf-8", dataType: "json", // 指定返回数据类型为JSON success: function(res, textStatus, jqXHR) { window.location.href = res.redirectUrl; // 执行页面跳转 } });
方式B:将返回的HTML内容加载到当前页面容器
若无需跳转新页面,可把viewResult.jsp的内容插入到当前页面的指定DOM元素中:
$.ajax({ url: "viewResult", type:"POST", data: "TEST", contentType: "application/json; charset=utf-8", success: function(res, textStatus, jqXHR) { // 假设页面存在id为resultContainer的容器 $("#resultContainer").html(res); } });
内容的提问来源于stack exchange,提问作者gre_c
相关产品推荐
相关产品推荐

