Maven Web 项目 + Tomcat 从零排错全流程(零遗漏版)

下面的流程是按「底层→上层」的顺序设计的,每一步都必须验证通过,再往下走,这样能精准定位问题,不会再像之前那样反复踩坑。


🔴 前置准备:彻底清理环境(避免旧配置干扰)

先确认你的项目依赖列表(共 3 个)

1、Maven相关管理依赖

2. Servlet 接口依赖

pom.xml文件中写法

复制代码
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

作用:写 Java Web 项目必须的 Servlet 接口 (处理请求、响应),Tomcat 自带,所以标记 provided


2. Lombok 工具依赖

pom.xml文件中写法

复制代码
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

作用:简化 Java 代码,自动生成 getter/setter/ 构造器等,不用手写。

这一步必须做,否则之前的错误配置会一直影响你。

  1. 关闭所有 IDE、命令行窗口,彻底退出 IDEA

  2. 执行命令,杀死所有 Java 进程(防止端口被占用): cmd----------taskkill /f /im java.exe

    cmd---------- taskkill /f /im javaw.exe

复制代码
   taskkill /f /im java.exe
   taskkill /f /im javaw.exe
  1. 清理 Tomcat 旧部署:
    • 打开 D:\tomcat\webapps,删除里面所有文件夹和 war 包(只保留 ROOTmanager
    • 打开 C:\Users\你的用户名\AppData\Local\JetBrains\IntelliJIdea2025.3\tomcat,删除里面所有文件夹(IDEA 的 Tomcat 缓存)

第一步:确认基础环境正常(先保证服务器本身能跑)

1. 验证 Tomcat 安装


总结

  1. 打开 D:\tomcat\conf\server.xml,确认 HTTP 端口是 8089(和你之前的配置一致)

    关键配置确认

    文件中这一行明确定义了 Web 访问端口:

    xml

    复制代码
    <Connector port="8089" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               />

    补充说明(避免混淆)

  2. 8189 :是 Tomcat 关闭端口 (仅用于本地关闭服务,不用于网页访问)

    xml

    复制代码
    <Server port="8189" shutdown="SHUTDOWN">
  3. 8443:是 HTTPS 加密端口(默认注释未启用)

  4. 8009:是 AJP 端口(默认注释未启用)

  5. 网页访问地址http://localhost:8089

核心业务端口8089 (正确)

要判断核心业务端口是否正确,必须双击**startup.bat双击 D:\tomcat\bin\startup.bat****,启动 Tomcat**

变成这样一直不能关闭!!!!关闭http://localhost:8089就无法访问!!!!

  1. 打开浏览器,访问 http://localhost:8089
    • ✅ 看到 Tomcat 默认页面,说明服务器正常

    • ❌ 看不到,说明 Tomcat 安装 / 端口有问题,先解决这个再往下走

  2. 双击 D:\tomcat\bin\shutdown.bat,关闭 Tomcat,测试完了,就可以关闭,因为后面你呀开启idea在里面运行了。外面是不能再开着shutdown.bat的,别忘了。

2. 验证 JDK 配置

  1. 打开 IDEA → 文件 → 项目结构 → 项目

    • 项目 SDK:选择你安装的 JDK 17
    • 语言级别:设置为 17 - 带密封类的新特性
  2. 点击「应用」→「确定」


第二步:验证项目结构(最核心的一步,错了全白搭)

按下面的标准结构检查你的项目,每一个文件夹、文件的位置都必须完全一致

plaintext

复制代码
你的项目根目录/
├── pom.xml                  ✅ 必须有
└── src/
    └── main/
        ├── java/            ✅ 放所有Java代码(包括Servlet)
        │   └── dey7/
        │       └── ScoreServlet.java
        ├── resources/       ✅ 空的也没关系
        └── webapp/          ✅ 必须直接在main下,名字必须是webapp
            ├── index.jsp    ✅ 必须直接放在这里,不能嵌套
            ├── register.html ✅ 同理
            └── WEB-INF/     ✅ 必须在webapp下,名字全大写
                └── web.xml  ✅ 必须在这里,名字全小写

❌ 必须删除的东西:

  • webapp 下的 web 文件夹(如果还有)
  • WEB-INF 里的 classeslib 文件夹(这些是构建生成的,不能手动放)
  • 任何在 WEB-INF 里的 JSP/HTML 文件(浏览器直接访问不到)

第三步:配置 IDEA Web 项目识别(告诉 IDEA 这是个 Web 项目)

打开 IDEA → 文件 → 项目结构 → Facets

复制代码
 ### **点击「+」→ 选择「Web」→ 选中你的项目**
 ![](https://i-blog.csdnimg.cn/direct/c262646c18ba486fa4a4a61bd6cba50b.png)
复制代码
 ### **确认「Web 资源目录」指向****src/main/webapp**
 ![](https://i-blog.csdnimg.cn/direct/3b93e01b47bd464fb19af708166f7f5d.png)
复制代码
 ### **确认「部署描述符」指向****src/main/webapp/WEB-INF/web.xml**
 ![](https://i-blog.csdnimg.cn/direct/c9906e09a35e4e6a8e0a978914b275b6.png)
  • 点击「应用」
  1. 切换到 工件 → 点击「+」→ 选择「Web 应用程序:展开式」→ 选择「来自模块」→ 你的项目
    • 勾选「包含在项目构建中」

    • 点击右边的「可用元素」里的项目,右键 → 「置于 Output Root」

      或者

    • 确认左边输出根目录下,能直接看到 index.jsp

    • 点击「应用」→「确定」


第四步:配置 Tomcat 运行(让 IDEA 能把项目部署到 Tomcat)

  1. 打开 IDEA → 左上角→ 运行→ 「编辑配置」→ 点击「+」→ 选择「Tomcat 服务器 → 本地」
  2. 服务器标签页配置
    • 应用程序服务器:选择你的 D:\tomcat
    • HTTP 端口:8089(和 tomcat文件中bin文件中server.xml 一致)
    • JRE:选择你安装的 JDK 17
    • 取消勾选「启动前更新资源」
  3. 部署标签页配置(最关键)
    • 点击「+」→ 选择「工件」→ 选中 wslant:war exploded
    • 应用程序上下文:改为 /wslant(必须和你访问的地址一致)(手动输入下)
  4. 执行前标签页配置
    • 点击「+」→ 选择「构建工件」→ 选中 wslant:war exploded
  5. 点击「应用」→「确定」

第五步:验证核心文件配置(Servlet 和 web.xml)

1. 验证 Servlet 类

打开 ScoreServlet.java,确认:

  • 类上有 @WebServlet("/ScoreServlet") 注解

  • 类继承 HttpServlet

  • doGet/doPost 方法

    复制代码
    package dey7;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 成绩处理Servlet
     * 作用:接收前端提交的班级人数和成绩数据,进行处理后转发到页面展示
     */
    // 配置Servlet访问路径,必须加这个注解,否则Tomcat找不到该Servlet
    @WebServlet("/ScoreServlet")
    public class ScoreServlet extends HttpServlet {
    
        /**
         * 处理POST类型的请求
         * 前端表单提交方式为post时,会执行这个方法
         */
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 1. 设置请求编码为UTF-8,解决前端传递中文乱码问题
            request.setCharacterEncoding("UTF-8");
    
            // 2. 获取前端传递的班级人数字段 n
            int n = Integer.parseInt(request.getParameter("n"));
    
            // 3. 创建集合,用于存储所有学生的成绩
            List<Double> scores = new ArrayList<>();
    
            // 4. 循环获取每一位学生的成绩,并添加到集合中
            for (int i = 0; i < n; i++) {
                // 根据参数名 score0、score1、score2... 获取对应成绩字符串
                String scoreStr = request.getParameter("score" + i);
                // 将字符串类型的成绩转换为double类型
                double score = Double.parseDouble(scoreStr);
                // 把成绩存入集合
                scores.add(score);
            }
    
            // 5. 将成绩集合存入request域对象,供index.jsp页面获取和展示
            request.setAttribute("scores", scores);
    
            // 6. 请求转发到index.jsp页面,展示最终结果
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        }
    
        /**
         * 处理GET类型的请求
         * 为了统一处理逻辑,直接调用doPost方法
         */
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // GET请求直接复用POST的处理逻辑
            doPost(request, response);
        }
    }

✅ 这份代码现在完全满足你所有要求

  1. 类上有 @WebServlet("/ScoreServlet") 注解 ✅
  2. 类继承 HttpServlet
  3. doGetdoPost 方法 ✅
  4. 每一步都加了详细中文注释
  5. 代码可直接运行,不会报错 ✅

2. 验证 web.xml(如果不用注解)

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 欢迎页配置:访问项目自动打开 index.jsp -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

第六步:构建项目(确保文件编译打包正确)

  1. 打开 IDEA 右侧的「Maven」面板

  2. 执行 cleancompilepackage(按顺序执行)

  3. 打开项目的 target/wslant-1.0-SNAPSHOT 文件夹,验证:

    • ✅ 根目录下有 index.jspregister.html
    • ✅ 有 WEB-INF 文件夹,里面有 web.xml
    • WEB-INF/classes 里有 dey7/ScoreServlet.class 文件

    ❌ 没有多余的文件夹(比如 webWEB-INF/classes 手动放的文件)


    **都没问题,那么可以开始运行你的Tomcat本地服务器了。**启动你的项目



如果你报错,一下是最容易出现问题的,步骤。

启动 Tomcat 并验证(按顺序验证,哪步错了停在哪)

  1. 点击 IDEA 右上角的 Tomcat 启动按钮,启动服务器

  2. 看控制台日志,只要看到 服务器启动完成 且无报错,就是启动成功

  3. 按以下顺序验证,每一步都必须成功,再往下走

    表格

    验证步骤 访问地址 预期结果 失败排查方向
    1. 验证 Tomcat 本身 http://localhost:8089 看到 Tomcat 默认页面 端口占用、Tomcat 配置
    2. 验证项目部署 http://localhost:8089/wslant/index.jsp 看到你的 JSP 页面 项目结构、工件配置、上下文路径
    3. 验证 Servlet http://localhost:8089/wslant/ScoreServlet 看到 Servlet OK! Servlet 注解、web.xml 配置、编译问题

🔴 关键失败排查清单(按优先级)

  1. ERR_CONNECTION_REFUSED :Tomcat 没启动,或端口被占用 → 执行 taskkill /f /im java.exe,换端口重试
  2. 404 Not Found
    • 先检查上下文路径是否为 /wslant
    • 再检查 target 文件夹里有没有生成 wslant-1.0-SNAPSHOT 目录
    • 最后检查 index.jsp 是否在 webapp 根目录
  3. ClassNotFound :Servlet 没编译成功 → 执行 clean compile,检查 target/classes 里有没有 .class 文件
  4. 部署源无效 :工件配置错了 → 确认部署的是 wslant:war exploded,不是 war
相关推荐
豆苗学前端1 小时前
【前端内功】同为数据驱动,为什么只有 React 的"心智负担"这么重?(附实战优化指南)
前端·vue.js·面试
铁皮饭盒1 小时前
震惊, Bun突发新版, 重写核心, 换掉了底层Zig
前端·javascript·后端
IT_陈寒1 小时前
深入理解Java:核心原理与最佳实践
前端·人工智能·后端
恋猫de小郭1 小时前
Android Studio 放着没怎么用,怎么也会越来越卡?
android·前端·flutter
fanzhonghong1 小时前
javaWeb开发之前端实战(Vue工程化+ElementPlus)
前端·javascript·vue.js·后端·spring
openKaka_1 小时前
completeWork:真实 DOM 是在哪里被创建的
前端·javascript·react.js
希冀1231 小时前
【CSS学习第六篇】
前端
Python大数据分析@2 小时前
说说Markdown为什么不会被HTML取代
前端·html
史迪仔01122 小时前
[QML] Qt5/6图像色彩空间处理
开发语言·前端·c++·qt