Servlet POST请求返回GET结果及URL映射404问题求助
问题分析与解决方案
咱们先来拆解你遇到的核心问题:URL路径不匹配导致Servlet的doPost()没被触发,同时映射路径请求返回404。一步步来解决:
1. 为什么URL映射的请求返回404?
你的Servlet在web.xml里的映射是/portal,而WAR包的上下文根是/SelfservicePortal(因为WAR文件名就是SelfservicePortal),所以正确的Servlet访问URL应该是:
http://localhost:8080/SelfservicePortal/portal
你测试时的两个错误点:
- 访问
/SelfservicePortal/portal/(末尾多了斜杠):和配置的/portal路径不匹配,Tomcat找不到对应的Servlet,直接返回404 - 访问
/SelfservicePortal:这是项目的上下文根,并没有映射到你的SelfserviceServlet,Tomcat会自动返回根目录下的默认欢迎页(比如WebContent/index.jsp),而非触发你的Servlet的doGet()方法
2. 为什么POST请求返回index.jsp?
你AJAX里的请求URL是/SelfservicePortal和/SelfservicePortal/portal/,都没命中正确的Servlet映射路径:
/SelfservicePortal直接命中默认欢迎页,所以返回index.jsp/SelfservicePortal/portal/是无效路径,返回404
修复步骤
步骤1:修正AJAX请求的URL
不要硬编码上下文根,用JSP内置对象动态获取,避免部署环境变化导致路径错误:
<html> <head> <script> function sendPOST(){ // 动态获取项目上下文根,避免硬编码 var contextPath = "${pageContext.request.contextPath}"; $.ajax({ url: contextPath + "/portal", // 正确的Servlet访问路径 type: "POST", contentType: "application/x-www-form-urlencoded", // 用对象形式传递参数更简洁易维护 data: { someparam: encodeURIComponent(someparam), someotherparam: encodeURIComponent(someotherparam) }, success: function(data) { alert(data); }, // 优化错误提示,方便排查问题 error: function(xhr) { alert("Error: " + xhr.status + " " + xhr.statusText); } }); } </script> <body> <button type="button" onclick="sendPOST();">Send POST</button> </body> </html>
步骤2:检查Servlet的部署正确性
确保你的Servlet被Tomcat正确加载:
- 检查WAR包结构:
WEB-INF/classes/com/somename/module/SelfserviceServlet.class必须存在,包名要和web.xml里的com.somename.module.SelfserviceServlet完全一致 - 查看Tomcat启动日志(
tomcat/logs/localhost.log或catalina.log),如果看到类似Initializing Servlet 'SelfservicePortal'的日志,说明Servlet加载成功;如果出现ClassNotFoundException,说明类路径或包名写错了 - 确认
web.xml里的servlet-name和servlet-mapping中的名称完全一致,没有拼写错误
步骤3:修复doPost方法的潜在错误
你的doPost()方法里html_output变量未定义,会导致运行时空指针异常,需要补充初始化逻辑:
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String ip_address = request.getParameter("someparam"); String port = request.getParameter("someotherparam"); // 初始化html_output,替换成你的实际业务处理逻辑 StringBuilder html_output = new StringBuilder(); html_output.append("IP地址: ").append(ip_address).append("\n端口: ").append(port); response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(html_output.toString()); }
步骤4:验证正确的访问路径
- GET请求:
http://localhost:8080/SelfservicePortal/portal应该返回WEB-INF下的index.jsp - POST请求:点击按钮触发AJAX后,应该能收到
doPost()返回的文本内容
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

