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

Servlet未接收到$.ajax请求的问题排查求助

问题排查与修复方案

以下是导致Servlet未接收到AJAX请求的常见原因及对应修复方式:

1. 未阻止表单默认提交行为

表单点击提交按钮后会触发默认页面跳转,直接中断AJAX请求。需在create()函数中阻止该行为:

修改create.js:

const create = (event) => {
    // 阻止表单默认提交逻辑
    event.preventDefault();

    const name = document.querySelector('input[name="name"]').value;
    const city = document.querySelector('input[name="city"]').value;
    const country = document.querySelector('input[name="country"]').value;

    const formData = {
        name: name,
        city: city,
        country: country
    };

    $.ajax({
        url: 'CreateInstallationServlet',
        type: 'POST',
        data: formData,
        success: function(data) {
            console.log('Form data sent successfully.');
            window.location.href = 'visualize.jsp';
        },
        // 新增错误回调,方便排查请求失败原因
        error: function(xhr, status, error) {
            console.error('AJAX请求失败:', status, error);
            console.error('响应详情:', xhr.responseText);
        }
    });
}

同步修改JSP表单的onsubmit属性,传递事件对象:

<form action="javascript:void(0);" onsubmit="create(event)">

2. 确认jQuery已正确引入

AJAX代码使用了$,如果header.jsp中未引入jQuery库,会触发$ is not defined错误,导致函数无法执行。在header.jsp中添加jQuery引用:

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

(若采用本地部署,替换为项目内jQuery文件的相对路径即可)

3. 解决Servlet映射冲突

你同时使用了web.xml配置和@WebServlet注解映射Servlet,这可能导致Tomcat无法正确识别路径。二选一保留即可:

  • 方案一:保留web.xml配置,删除Servlet类上的@WebServlet("/CreateInstallationServlet")注解
  • 方案二:保留@WebServlet注解,删除web.xml中的Servlet配置块

4. 验证AJAX请求的URL路径

若当前JSP页面位于项目子目录(如/pages/create.jsp),相对路径CreateInstallationServlet会被解析为/pages/CreateInstallationServlet,与Servlet的映射路径不匹配。可改为绝对路径:

// 替换为你的项目上下文路径
url: '/your-project-context/CreateInstallationServlet',

或用JSP EL表达式动态获取上下文路径:

url: '${pageContext.request.contextPath}/CreateInstallationServlet',

5. 完善Servlet的doPost方法

原Servlet的doPost方法未处理响应、未处理编码,可能引发请求异常。修改如下:

package webapp;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/CreateInstallationServlet")
public class CreateInstallationServlet extends HttpServlet  {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置请求编码,避免中文乱码
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        String city = request.getParameter("city");
        String country = request.getParameter("country");

        System.out.println("called servlet");
        System.out.println("接收参数: Name=" + name + ", City=" + city + ", Country=" + country);

        Utils utils = new Utils();
        try {
            utils.createInstallation(name, city, country);
            // 返回成功响应给AJAX
            response.setContentType("text/plain");
            response.getWriter().write("success");
        } catch (Exception e) {
            e.printStackTrace();
            // 返回错误响应
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().write("error: " + e.getMessage());
        }
    }
}

完成以上修复后,重启Tomcat,打开浏览器开发者工具(F12)的网络标签,点击提交按钮查看AJAX请求状态及响应,即可确认问题是否解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:17:14