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

如何向Servlet传递JSON对象?现有代码无法运行求排查

代码问题分析及修正方案

以下是你的代码中存在的问题及对应的修正方法:

前端JSP代码问题

  • AJAX数据传递格式不匹配:当前代码将JSON字符串封装在jsonData表单参数中发送,但后端尝试直接读取整个请求体解析JSON,导致解析失败。有两种修正方向:
    1. 前端直接发送纯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);
        }
      });
      
    2. 后端通过req.getParameter("jsonData")获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:06:30