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

Struts1中AJAX请求后ActionForm值全部为空的问题咨询

解决Struts1中AJAX请求ActionForm值为null的问题

嘿,我太熟悉Struts1这个老框架的坑了!你的问题根源其实很简单:Struts1的ActionForm默认只认application/x-www-form-urlencoded这种表单编码格式的请求,但你现在AJAX里设置了contentType: 'application/json',把请求体以JSON字符串发过去,Struts1的表单自动映射机制完全没法处理这种格式,自然就把ActionForm的所有字段留成null了。

给你两个实用的解决方案,看你业务需求选:

方案一:改成表单编码请求(最省心)

如果不是必须用JSON,直接把请求改成Struts1熟悉的表单格式就行。调整你的AJAX代码:

function loging() { 
    // 这里把getFormData()改成直接返回键值对(如果原来的getFormData是JSON对象,直接传即可,jQuery会自动转换格式)
    var formData = {
        account: $("#account").val(), // 替换成你实际获取输入框值的方式
        pwd: $("#pwd").val()
    };
    $.ajax({ 
        url : '${pageContext.request.contextPath}/hello.do?method=jsonHi', 
        type : 'POST', 
        data : formData, 
        // 删掉contentType: 'application/json',jQuery默认就是表单编码格式
        dataType : 'json', 
        async: false, 
        success : function(data) { 
            alert("success"); 
        }, 
        error : function() { 
            alert("error!"); 
        } 
    }); 
}

改完之后,只要你的ActionForm类里有account和pwd对应的getter/setter方法,Struts1就能自动把参数值塞进去了。

方案二:坚持用JSON,手动解析(适合必须传JSON的场景)

如果业务上一定要发JSON,那只能在Action里自己动手解析请求体了。步骤如下:

  1. 先给项目加个JSON解析库,比如Jackson或者Gson(推荐Jackson,社区使用更广泛)
  2. 改写你的Action方法:
public ActionForward jsonHi(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 第一步:读取请求体里的JSON字符串
    BufferedReader reader = request.getReader();
    StringBuilder jsonBuilder = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        jsonBuilder.append(line);
    }
    String jsonContent = jsonBuilder.toString();
    
    // 第二步:用Jackson把JSON转成你的ActionForm对象
    ObjectMapper objectMapper = new ObjectMapper();
    YourLoginForm loginForm = objectMapper.readValue(jsonContent, YourLoginForm.class);
    
    // 现在loginForm里的account和pwd就有值了,接下来按业务逻辑处理即可
    System.out.println("账号:" + loginForm.getAccount());
    System.out.println("密码:" + loginForm.getPwd());
    
    // 最后返回JSON响应(如果需要的话)
    response.setContentType("application/json;charset=UTF-8");
    response.getWriter().write("{\"result\":\"success\"}");
    
    return null; // 不需要跳转视图,直接返回响应就行
}

注意这种情况下,方法参数里的form还是会是null,你得用自己解析出来的loginForm来处理业务逻辑。

最后补个小提醒

不管用哪种方案,都要确保你的ActionForm类里的字段名和前端传的参数名完全一致,而且每个字段都有对应的getter和setter方法——这是Struts1能映射参数的基础哦!

内容的提问来源于stack exchange,提问作者PeteH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:00:58