跳到主要内容

S-Eclipse-Tomcat Web 开发入门指南

Tomcat Web 开发入门指南

对于刚接触 Java Web 开发的工程师,理解 Tomcat 和 Servlet 的工作原理是核心。以下是一份精简的入门指南:

1. 什么是 Tomcat?

Tomcat 是由 Apache 软件基金会开发的一个开源 Web 服务器Servlet 容器

  • Web 服务器:负责处理 HTTP 请求,返回 HTML、图片等静态资源。
  • Servlet 容器:负责运行 Java 代码(Servlet/JSP),将动态生成的 HTML 返回给客户端。

2. 核心概念

  • Servlet:运行在服务器端的 Java 程序。它接收客户端的 HTTP 请求(HttpServletRequest),处理业务逻辑(如查数据库),并返回响应(HttpServletResponse)。
  • JSP (JavaServer Pages):一种允许在 HTML 中嵌入 Java 代码的技术。Tomcat 在运行时会自动将 JSP 文件编译成 Servlet。JSP 适合用来写页面展示,Servlet 适合用来写业务逻辑。
  • web.xml:Web 应用的部署描述符。它告诉 Tomcat 哪个 URL 请求应该交给哪个 Servlet 类去处理。

3. 标准的 Java Web 目录结构

无论你使用什么 IDE,最终打包给 Tomcat 运行的结构(WAR包)都是固定的:

复制
/项目根目录 (对应 http://localhost:8080/项目名/)
├── index.jsp (可以直接通过浏览器访问的静态/动态页面)
├── css/、js/、images/ (静态资源)
└── WEB-INF/ (安全目录,浏览器绝对无法直接访问这里面的文件)
├── web.xml (核心配置文件)
├── classes/ (编译后的 .class Java 字节码文件)
└── lib/ (项目依赖的第三方 .jar 包,如 mysql-connector)

注意:Maven 的 src/main/webapp 目录在打包时,会被直接映射为上述的根目录。

4. Servlet 的生命周期

当你在代码里写了一个 CarsServlet 继承自 HttpServlet 时,Tomcat 会这样管理它:

  1. 实例化与初始化 (init):默认情况下,Tomcat 收到第一次访问该 Servlet 的请求时,才会创建它的实例,并调用 init() 方法(只调用一次)。
  2. 处理请求 (service / doGet / doPost):每次有请求发来,Tomcat 分配一个线程调用 doGet()doPost() 方法处理。
  3. 销毁 (destroy):当 Tomcat 关闭或重启应用时,调用 destroy() 回收资源。

5. 常见错误排查指南

在开发过程中,你最常遇到的错误代码及原因:

  • 404 Not Found
    • 路径写错了(检查浏览器 URL 是否包含正确的项目名,如 /ktm-test/api/cars)。
    • web.xml 中的 <url-pattern> 映射错误。
    • JSP 文件没有放在 webapp 目录下。
  • 500 Internal Server Error
    • 你的 Java 代码抛出了异常(如空指针 NullPointerException、数据库连接失败 SQLException)。
    • 解决办法:立刻去 Eclipse 的 Console (控制台) 查看红色的报错堆栈信息,定位到具体的 Java 类和行号。
  • ClassNotFoundException / NoClassDefFoundError
    • 缺少 Jar 包依赖。检查 pom.xml 是否引入了相关的依赖,并执行 Maven -> Update Project
  • 端口被占用 (Port 8080 already in use)
    • Mac 上可能有其他程序(或另一个 Tomcat 进程)占用了 8080 端口。
    • 解决办法:在 Eclipse 的 Servers 视图双击 Tomcat,在打开的配置页面中将 HTTP/1.1 的端口改为 8081 或其他数字,保存后重启。

更新pom.xml 中的依赖文件后,Tomcat运行时无法找到新下载的包?

原因解释: Maven 确实把 jar 包下载到了你的电脑上,你的代码在编写时也不报错(因为 IDE 知道这个包的存在)。但是,当你启动 Tomcat 时,IDE 并没有把这个 jar 包打包复制到 Web 项目的 WEB-INF/lib 目录下。Tomcat 运行时只认 WEB-INF/lib 里面的包,所以报了找不到类的错误。

请根据你使用的 IDE,按照以下步骤将依赖同步到部署包中:

如果你使用的是 IntelliJ IDEA:

  1. 点击顶部菜单栏的 File -> Project Structure(快捷键 Ctrl + Alt + Shift + S)。
  2. 在弹出的窗口左侧面板,点击 Artifacts
  3. 在中间的列表中,选中你当前 Tomcat 正在使用的部署包(通常名字叫 你的项目名:war exploded)。
  4. 看右侧的 Output Layout 区域,展开 <output root> -> WEB-INF
    • 注意:如果 WEB-INF 下面没有 lib 文件夹,请右键 WEB-INF -> Create Directory,创建一个名为 lib 的文件夹。
  5. 看界面最右侧Available Elements 面板。
    • 展开 Maven Dependencies(或者直接找到 postgresql-42.x.jar)。
    • 右键点击它,选择 "Put into /WEB-INF/lib"(或者直接双击它 / 拖拽到左侧的 lib 文件夹中)。
  6. 此时,你应该能在中间的 WEB-INF/lib 目录下看到 PostgreSQL 的 jar 包了。
  7. 点击右下角的 Apply,然后点击 OK
  8. 重启 Tomcat,问题即可解决。

如果你使用的是 Eclipse:

  1. 在项目上右键,选择 Properties(属性)。
  2. 在左侧菜单中找到并点击 Deployment Assembly(部署装配)。
  3. 查看右侧的列表中,是否有 Maven Dependencies 这一项,并且它的 Deploy PathWEB-INF/lib
  4. 如果没有,点击右侧的 Add... 按钮。
  5. 选择 Java Build Path Entries,点击 Next
  6. 选中 Maven Dependencies,点击 Finish
  7. 点击 Apply and Close
  8. Servers 面板中,右键你的 Tomcat,选择 Clean...,然后重启 Tomcat

按照上述步骤把 jar 包“塞”进 Tomcat 的运行目录后,驱动就能被正常加载了。