Java Servlets与Ajax交互问题:无法触发success回调
问题解决:Ajax无法触发success回调的原因及修复方案
问题根源
你的Ajax请求设置了dataType:'json',这意味着jQuery会严格校验响应内容是否为合法JSON格式——哪怕Servlet返回200状态码,只要响应内容不是合法JSON(比如空字符串、纯文本"SUCCESS"),jQuery就会判定请求失败,触发error回调而非success。
具体修复步骤
1. 修改Servlet成功分支,返回合法JSON
在用户不存在、保存成功的分支里,必须返回符合JSON规范的内容,并设置正确的响应头:
else { adminSecurityDAOImpl.saveUser(user); // 设置响应类型为JSON,指定编码 response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); // 返回合法的JSON字符串(哪怕是最简单的结构) response.getWriter().write("{\"status\":\"success\"}"); response.flushBuffer(); return; }
2. 错误分支的优化(可选)
当前错误分支用response.sendError(400)的逻辑是正确的,会触发Ajax的error回调。如果想让前端动态获取错误信息,可以修改为:
if (adminSecurityDAOImpl.isUserExist(login)) { response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); // 先设置错误状态码,再返回JSON格式的错误信息 response.sendError(400, "{\"error\":\"Пользователь с таким логином уже существует\"}"); response.flushBuffer(); return; }
对应的前端error回调可以改为:
error : function(xhr, status, error) { var errorData = JSON.parse(xhr.responseText); $("#errorLogin").text(errorData.error); }
3. 优化请求参数(可选)
你的请求URL里已经带了?save=save,同时data里又传了save: 'save',会导致请求参数重复。可以去掉URL里的参数,只用data传递:
url:"/adminUser", data: {save: 'save', login:login, pass1:pass1, userName:userName, email:email, bukhUsersId: bukhUsersId, otdelId: otdelId, roleId: roleId, checkActive: checkActive},
内容的提问来源于stack exchange,提问作者egor-n
相关产品推荐
相关产品推荐

