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里自己动手解析请求体了。步骤如下:
- 先给项目加个JSON解析库,比如Jackson或者Gson(推荐Jackson,社区使用更广泛)
- 改写你的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
相关产品推荐
相关产品推荐

