Tomcat 启动后只显示 index.jsp,没有进入你的 Servlet 逻辑

目录

[🧩 问题分析:为什么执行的是 index.jsp 而不是 Servlet?](#🧩 问题分析:为什么执行的是 index.jsp 而不是 Servlet?)

[① index.jsp 拦截了根路径 /](#① index.jsp 拦截了根路径 /)

[② 编译输出路径错误](#② 编译输出路径错误)

[③ web.xml 与注解配置冲突](#③ web.xml 与注解配置冲突)

[✅ 解决方案(推荐顺序)](#✅ 解决方案(推荐顺序))

[方法 1:换个 URL 路径](#方法 1:换个 URL 路径)

[方法 2:删除或重命名 index.jsp](#方法 2:删除或重命名 index.jsp)

[方法 3:确认 Tomcat 加载了这个 Servlet](#方法 3:确认 Tomcat 加载了这个 Servlet)

[方法 4:检查 web.xml](#方法 4:检查 web.xml)

[💡 小结](#💡 小结)


🧩 问题分析:为什么执行的是 index.jsp 而不是 Servlet?

有三种最常见的原因:

① index.jsp 拦截了根路径 /

Tomcat 默认会将请求路径 / 映射到 src/main/webapp/index.jsp(或 index.html)。

而你的 Servlet 也是用的 @WebServlet("/")

结果:

Tomcat 检测到根路径有静态资源(index.jsp),就直接返回 JSP 页面,不会再调用 Servlet。

⚠️ 这时 tomcat_servlet 类虽然加载进 Tomcat,但永远不会被调用。


② 编译输出路径错误

如果 Maven 没有正确编译,或者 Main.java 没有正确指向 target/classes,Tomcat 根本没加载到这个 Servlet class。

也就是说:

Servlet 代码存在于 src/main/java,但 Tomcat 实际扫描的 class 路径(target/classes)里没有这个文件。


③ web.xml 与注解配置冲突

如果你的 WEB-INF/web.xml 文件中配置了一个 <welcome-file-list>

复制代码
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

Tomcat 会优先使用 JSP 作为欢迎页,跳过 Servlet 映射。


✅ 解决方案(推荐顺序)

方法 1:换个 URL 路径

修改注解,让 Servlet 不和 JSP 冲突:

复制代码
@WebServlet(urlPatterns = "/hello")
public class tomcat_servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        String name = req.getParameter("name");
        if (name == null) {
            name = "worldaaaaaaaa";
        }
        PrintWriter pw = resp.getWriter();
        pw.write("<h1>Hello, " + name + "!</h1>");
        pw.flush();
    }
}

然后访问:

复制代码
http://localhost:8080/hello

------这样就不会被 index.jsp 抢先响应了。


方法 2:删除或重命名 index.jsp

直接把 src/main/webapp/index.jsp 删除,或者改名为别的文件(例如 main.jsp)。

再运行:

复制代码
http://localhost:8080/

此时根路径就会由你的 Servlet 处理。


方法 3:确认 Tomcat 加载了这个 Servlet

可以在 Main.java 启动后查看控制台日志:

如果有类似日志:

复制代码
INFO: Initializing Servlet tomcat_servlet

说明你的 servlet 被加载。

如果没有这行,说明 target/classes 没有生成这个 class。

执行:

复制代码
mvn clean compile

看看 target/classes/com/itranswarp/learnjava/servlet/tomcat_servlet.class 是否存在。


方法 4:检查 web.xml

如果存在 web.xml,可暂时移除其中的 <welcome-file-list> 配置,

让请求 / 不再默认跳转到 JSP。


💡 小结

问题 原因 解决方案
Servlet 映射和 JSP 冲突 @WebServlet("/") + index.jsp 改为 /hello 或删除 JSP
Tomcat 没加载 Servlet 编译路径错误 运行 mvn compile,确保 target/classes 存在
web.xml 欢迎页覆盖 <welcome-file-list> 存在 注释掉或删除
相关推荐
带刺的坐椅21 小时前
(对标 Spring IA 和 LangChain4j)Solon AI & MCP v3.7.0, v3.6.4, v3.5.8 发布(支持 LTS)
java·spring·ai·solon·mcp·langchain4j
7澄121 小时前
深入解析 LeetCode 1572:矩阵对角线元素的和 —— 从问题本质到高效实现
java·算法·leetcode·矩阵·intellij-idea
诗9趁年华21 小时前
缓存三大问题深度解析:穿透、击穿与雪崩
java·spring·缓存
阳光明媚sunny21 小时前
分糖果算法题
java·算法
whltaoin21 小时前
【JAVA全栈项目】弧图图-智能图床SpringBoot+MySQL API接口结合Redis+Caffeine多级缓存实践解析
java·redis·spring·缓存·caffeine·多级缓存
一 乐1 天前
医疗管理|医院医疗管理系统|基于springboot+vue医疗管理系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·医疗管理系统
华仔啊1 天前
SpringBoot 2.x 和 3.x 的核心区别,这些变化你必须知道
java·spring boot·后端
laocooon5238578861 天前
大数的阶乘 C语言
java·数据结构·算法
不见长安在1 天前
分布式ID
java·分布式·分布式id
熊小猿1 天前
Redis 缓存怎么更新?—— 四种模型与一次“迟到的删除”
java·后端·spring