如何向Servlet传递JSON对象?现有代码无法运行求排查
代码问题分析及修正方案
以下是你的代码中存在的问题及对应的修正方法:
前端JSP代码问题
- AJAX数据传递格式不匹配:当前代码将JSON字符串封装在
jsonData表单参数中发送,但后端尝试直接读取整个请求体解析JSON,导致解析失败。有两种修正方向:- 前端直接发送纯JSON字符串(推荐):
$.ajax({ type: "POST", url: "/login", data: JSON.stringify(myData), contentType: "application/json;charset=utf-8", // 必须指定该请求头,告知后端请求体格式 dataType: "json", success: function(resp) { console.log("请求成功", resp); }, error: function(xhr) { console.error("请求失败", xhr.responseText); } }); - 后端通过
req.getParameter("jsonData")获取JSON字符串。
- 前端直接发送纯JSON字符串(推荐):
- 缺少请求头声明:发送JSON数据时必须设置
contentType: "application/json;charset=utf-8",否则后端无法识别请求体的格式。 - 无回调逻辑:未添加
success/error回调,无法确认请求状态和返回结果,调试困难,建议补充上述示例中的回调代码。 - 表单提交阻止不彻底:在函数开头添加
thisEvent.preventDefault(),确保完全阻止表单默认提交行为,避免页面刷新。
Servlet代码问题
- 类名不符合Java规范:Java类名需首字母大写,将
login改为Login,同时修改web.xml中的servlet-class对应值。 - 变量未声明:
sPwd变量未定义,编译会报错,需添加String sPwd = "";声明。 - JSON结构解析错误:前端传递的JSON结构为
{"mydata": {"userName": "...", "pwd": "..."}},后端需先获取mydata节点,再读取用户名和密码:JSONObject jsObj = new JSONObject(sbuffer.toString()); JSONObject dataNode = jsObj.getJSONObject("mydata"); sUsername = dataNode.optString("userName"); sPwd = dataNode.optString("pwd"); - 请求体读取方式错误:如果前端用表单参数传递JSON,应使用
req.getParameter("jsonData")获取;如果改为纯JSON请求,才用req.getReader()读取请求体。 retResponse方法未实现:catch块中调用的retResponse方法未定义,需补充实现,示例:private String retResponse(String code, String msg) { JSONObject response = new JSONObject(); response.put("code", code); response.put("msg", msg); return response.toString(); }- 应重写
doPost方法:前端使用POST请求,Servlet应重写doPost方法而非通用的service方法,符合Servlet规范:@Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // 业务逻辑代码 } - 未设置字符编码:添加编码配置避免中文乱码:
req.setCharacterEncoding("UTF-8"); res.setCharacterEncoding("UTF-8"); res.setContentType("application/json;charset=utf-8");
部署与配置问题
- Servlet类存放路径错误:
Login.class应放在WEB-INF/classes目录下(而非WEB-INF根目录),如果类属于某个包(如com.example.servlet),则路径应为WEB-INF/classes/com/example/servlet/Login.class,同时web.xml中的servlet-class需填写全类名com.example.servlet.Login。 - web.xml配置需对应类名:修改类名后,web.xml中的
servlet-class要同步改为Login(若有包则写全类名)。
内容的提问来源于stack exchange,提问作者stockton
相关产品推荐
相关产品推荐

