在JavaScript中创建JSON对象发送至Servlet无响应问题
解决Angular发送JSON到Java Servlet无响应的问题
这种前后端通信卡壳的情况真的让人挠头,我帮你一步步排查可能的问题点,从前端到后端逐一梳理:
一、先排查前端请求的正确性
你的Angular代码片段没写完,首先要确保请求本身是完整且正确的:
1. 补全$http请求并设置正确的请求头
默认情况下,$http发送POST请求时的Content-Type是application/x-www-form-urlencoded,但我们发送的是JSON,必须手动设置请求头,否则Servlet无法正确解析请求体。完整的请求代码应该是这样:
angular.module('TestApp').controller('PostController', function($scope, $rootScope, $http) { $scope.retriveDataAndConvertToJson = function() { var collectionJsonData = new Array(); for (var i = 0; i < rowID.length; i++) { // 假设这里是向数组添加数据的逻辑,比如: collectionJsonData.push({ rowId: rowID[i], otherField: 'someValue' }); } // 发起POST请求的核心代码 $http({ method: 'POST', url: '/your-servlet-mapping-path', // 这里必须和Servlet的映射路径完全匹配 data: collectionJsonData, headers: { 'Content-Type': 'application/json' } // 关键:指定JSON格式 }).then(function successCallback(response) { // 前端成功回调,先确认请求是否发送成功 console.log("请求已发送,服务器响应:", response); }, function errorCallback(error) { // 前端失败回调,这里能帮你定位请求层面的问题 console.error("请求失败,错误信息:", error); }); }; });
2. 检查前端请求的基础问题
- 打开浏览器F12的Network标签,查看发送的请求:
- 状态码:如果是404,说明Servlet的路径写错了;如果是405,说明Servlet没重写
doPost方法;如果是500,说明服务器内部出错。 - 请求体:确认
Request Payload里的JSON数据是否符合预期。 - 请求头:确认
Content-Type是否为application/json。
- 状态码:如果是404,说明Servlet的路径写错了;如果是405,说明Servlet没重写
二、排查Java Servlet的配置与代码
如果前端请求看起来没问题,但Servlet没输出System.out.println(),说明请求可能根本没到达Servlet,或者Servlet代码有问题:
1. 确保Servlet的映射路径正确
无论是用注解还是web.xml配置,映射路径必须和前端请求的url完全一致:
// 用注解的方式(推荐) @WebServlet("/your-servlet-mapping-path") // 和前端url对应 public class YourServlet extends HttpServlet { // ... }
2. 必须重写doPost方法
因为前端用的是POST请求,如果你只重写了doGet,Servlet会返回405错误,且不会执行你的代码:
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先加这句调试,确认方法是否被调用 System.out.println("Servlet的doPost方法已触发!"); // 读取请求体中的JSON数据 StringBuilder sb = new StringBuilder(); BufferedReader reader = request.getReader(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } String receivedJson = sb.toString(); System.out.println("收到的JSON数据:" + receivedJson); // 解析JSON(需要引入Jackson或Gson依赖) // 示例:用Jackson解析为Java数组 ObjectMapper objectMapper = new ObjectMapper(); YourDataModel[] dataArray = objectMapper.readValue(receivedJson, YourDataModel[].class); // 处理数据的逻辑... // 给前端返回响应 response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write("{\"status\":\"success\",\"message\":\"数据接收成功\"}"); }
3. 处理跨域问题(如果前后端端口不同)
如果Angular运行在localhost:4200,Servlet在localhost:8080,会出现跨域问题,浏览器会先发送OPTIONS预检请求,此时需要在Servlet中添加CORS响应头:
@Override protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 允许指定域名跨域 response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200"); // 允许的请求方法 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); // 允许的请求头 response.setHeader("Access-Control-Allow-Headers", "Content-Type"); }
三、关键调试技巧
- 前端调试:通过浏览器控制台的Network标签确认请求是否发送、路径是否正确、数据是否完整。
- 后端调试:查看服务器日志(比如Tomcat的
logs/catalina.out),如果System.out没输出,先看日志里有没有404/405的错误信息;如果有异常,日志里会详细显示报错原因(比如Jackson依赖缺失、JSON解析错误等)。
内容的提问来源于stack exchange,提问作者Ashish Panda
相关产品推荐
相关产品推荐

