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
相关产品推荐
相关产品推荐

