You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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触发跳转

  1. 修改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;
    }
}
  1. 修改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>
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:37:03