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

