AJAX返回HTML源码而非字符串问题求助:Servlet未执行doPost
问题分析与解决方案
你遇到的问题核心在于重写了service方法却未正确处理请求分发,导致AJAX发起的POST请求没有被doPost方法处理,反而触发了service里初始化formList.jsp的逻辑,所以返回的是JSP的HTML源码。
HttpServlet的默认service方法会根据请求的方法(GET/POST等)自动分发到对应的doGet/doPost方法。如果你重写了service但没实现这个分发逻辑,原本的doPost就不会被调用,而是直接执行你自定义的service代码(比如转发到JSP)。
解决步骤
1. 修正service方法(若必须保留)
如果你确实需要自定义service方法,一定要在方法中添加请求分发逻辑,确保POST请求能走到doPost:
@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先执行你的初始化逻辑(如果有的话) // ... // 调用父类的service方法,让它自动分发请求到doGet/doPost super.service(request, response); }
2. 或直接删除自定义的service方法
如果初始化逻辑可以放在doGet中(用于处理页面首次加载的GET请求),建议删掉重写的service,让HttpServlet默认的分发机制生效:
- 页面首次加载的GET请求交给
doGet处理,负责初始化JSP:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 这里写初始化formList.jsp的逻辑,比如设置属性、转发到JSP request.getRequestDispatcher("/formList.jsp").forward(request, response); }
- AJAX的POST请求依然用你原来的
doPost处理:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); String value = request.getParameter("value"); response.getWriter().print(value); }
3. 前端代码补充错误排查(可选)
你的前端AJAX代码逻辑没问题,可以加个错误回调方便排查问题:
$(document).ready(function(){ $('#submit').click(function() { var value = $('#val').val(); $.ajax({ type:'POST', data:{value:value}, url:'FormList', success:function(result){ $('#res').text(result); }, error:function(xhr, status, error){ console.log("请求错误:" + status + " - " + error); console.log("返回内容:" + xhr.responseText); } }); }); });
4. 确认web.xml配置正确性
你的web.xml配置是正确的,注意如果FormList不在默认包下,要在<servlet-class>中填写完整包名(比如com.example.FormList)。
总结
核心是让请求正确分发到对应的doPost方法:要么修正自定义service方法调用父类逻辑,要么删掉service用doGet处理页面加载、doPost处理AJAX请求。这样AJAX就能收到正确的字符串返回,而不是JSP的HTML源码了。
内容的提问来源于stack exchange,提问作者Tamer Nassar
相关产品推荐
相关产品推荐

