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

Bootstrap前端向Express Servlet发送JSON数据时遇空指针问题求助

解决Bootstrap前端向Servlet发送JSON数据的空指针问题

我帮你排查出了几个导致数据传递失败、出现空指针的关键问题,咱们一步步修正:

一、前端AJAX请求的核心问题

你当前的AJAX请求在数据格式和请求头设置上有两处明显错误:

  • 数据拼接时没有使用正确的参数分隔符(比如&),导致参数混乱,Servlet完全无法解析
  • 没有设置contentType为application/json,也没有将数据序列化为标准JSON格式,Servlet无法识别请求体中的JSON数据

修正后的前端JavaScript代码

function registerStudent() {
    var firstName = $("#firstName").val();
    var lastname = $("#lastname").val();
    var phone = $("#phone").val();
    var email = $("#email").val();
    var studentCode = $("#studentCode").val();

    // 构造标准的JSON对象,字段名和后端实体类保持一致
    var studentData = {
        firstName: firstName,
        lastname: lastname,
        phone: phone,
        email: email,
        studentCode: studentCode
    };

    $.ajax({
        type: "POST",
        url: "/RegisterStudent",
        contentType: "application/json",  // 必须设置这个请求头,告诉后端接收的是JSON
        data: JSON.stringify(studentData), // 将JSON对象转为字符串发送
        success: function(data) {
            var ht = data.msg;
            $("#resp").html(ht);
        },
        error: function(xhr, status, error) {
            console.error("请求错误详情:", error);
            alert("Some error occured.");
        }
    });
}

二、Servlet端的处理问题

你当前用req.getParameter("data")获取JSON数据是错误的——这个方法只适用于application/x-www-form-urlencoded格式的表单数据。对于JSON格式的请求,需要直接读取请求体的内容,再用Jackson的ObjectMapper解析为Java对象。

修正后的Servlet代码

@WebServlet(urlPatterns = "/RegisterStudent")
public class RegisterStudentController extends HttpServlet {
    StudentServiceInter service = new StudentServiceImpl();
    ObjectMapper mapper = new ObjectMapper();

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Student student = new Student();
        req.getSession().setAttribute("student", student);
        resp.sendRedirect("/addStudent.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 读取请求体中的JSON原始内容
        StringBuilder sb = new StringBuilder();
        String line;
        BufferedReader reader = req.getReader();
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        String jsonData = sb.toString();

        // 将JSON字符串解析为Student实体类(确保Student类有对应属性和getter/setter)
        Student student = mapper.readValue(jsonData, Student.class);

        // 调用Service层保存学生数据(这里根据你的业务逻辑实现)
        // boolean isSaved = service.saveStudent(student);

        // 构造响应返回给前端
        resp.setContentType("application/json");
        PrintWriter out = resp.getWriter();
        // 用Jackson构造响应JSON,告诉前端注册结果
        String responseJson = mapper.writeValueAsString(Map.of("msg", "Student registered successfully!"));
        out.println(responseJson);
        out.close();
    }
}

额外注意事项

  • 确保你的Student实体类拥有与前端JSON字段完全匹配的属性,并且每个属性都有getter和setter方法,否则Jackson无法正确解析
  • 可以在Servlet中添加日志打印(比如System.out.println("接收到的JSON:" + jsonData);),方便调试时查看数据是否正确传递
  • 如果用Maven/Gradle管理项目,务必引入Jackson依赖:com.fasterxml.jackson.core:jackson-databind

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:52:20