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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:37:33