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

XmlHttpRequest.send()返回null且Servlet无法获取传参值问题

解决AJAX POST参数在Servlet中返回null的问题

嘿,我来帮你搞定这个问题!你遇到的request.getParameter("x")返回null的情况,核心原因是请求头和参数传递格式不匹配,下面给你两种可行的解决方案:

方案一:使用表单格式传递参数(简单直接)

你现在的代码里,发送的参数是x="+dbParam这种表单键值对格式,但却设置了Content-type: application/json,这就导致Servlet无法正确解析参数。调整一下请求头,让它和参数格式匹配即可:

修改后的JavaScript代码:

var dbParam = JSON.stringify({"name" :"success"});
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    // 这里可以处理返回的响应
    console.log(this.responseText);
  }
}
xmlhttp.open("POST", "MyServlet", true);
// 改成表单格式的请求头(其实默认就是这个,可省略,但明确写出来更清晰)
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("x="+dbParam);

这时候你的Servlet里String s=request.getParameter("x");就能正常拿到JSON字符串了,之后你可以再把它解析成JSON对象。

方案二:真正发送JSON格式数据(适合复杂场景)

如果你确实需要发送纯JSON格式的请求体,那就要调整发送的内容,同时Servlet端要读取整个请求体,而不是用getParameter:

修改后的JavaScript代码:

var dbParam = JSON.stringify({"name" :"success"});
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    console.log(this.responseText);
  }
}
xmlhttp.open("POST", "MyServlet", true);
xmlhttp.setRequestHeader("Content-type", "application/json");
// 直接发送JSON字符串,不要加x=前缀
xmlhttp.send(dbParam);

Servlet端读取请求体的代码:

// 设置字符编码,避免乱码
request.setCharacterEncoding("UTF-8");
BufferedReader reader = request.getReader();
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
    sb.append(line);
}
String jsonStr = sb.toString();
// 现在jsonStr就是你发送的{"name":"success"},可以用JSON库(比如Jackson、Gson)解析成对象

为什么原来的代码会返回null?

当你设置Content-type: application/json时,Servlet默认不会将请求体解析为request.getParameter()能识别的键值对参数,它只会把请求体当成纯文本。而你又把参数写成了x=xxx的表单格式,两边不匹配,自然拿不到值啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:15:18