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

在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。

二、排查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");
}

三、关键调试技巧

  1. 前端调试:通过浏览器控制台的Network标签确认请求是否发送、路径是否正确、数据是否完整。
  2. 后端调试:查看服务器日志(比如Tomcat的logs/catalina.out),如果System.out没输出,先看日志里有没有404/405的错误信息;如果有异常,日志里会详细显示报错原因(比如Jackson依赖缺失、JSON解析错误等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:46:35