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

