文章目录
- Tomcat保姆级使用教程
-
- [Tomcat 及 Servlet 介绍](#Tomcat 及 Servlet 介绍)
- Tomcat安装及配置
- [写第一个 Servlet](#写第一个 Servlet)
-
- [引入 Servlet API](#引入 Servlet API)
- [编写 HelloServlet](#编写 HelloServlet)
- [配置 WEB.XML](#配置 WEB.XML)
-
- [编写 web.xml](#编写 web.xml)
- 配置pom文件
- [在IDEA中启动 Tomcat](#在IDEA中启动 Tomcat)
-
- [配置 Tomcat Run Configuration](#配置 Tomcat Run Configuration)
- [运行 Tomcat](#运行 Tomcat)
- [Tomcat 的项目目录体系(了解加深)](#Tomcat 的项目目录体系(了解加深))
-
- [一、Tomcat 眼里的 Web 项目是什么?](#一、Tomcat 眼里的 Web 项目是什么?)
- [二、Tomcat 的整体目录结构(容器级)](#二、Tomcat 的整体目录结构(容器级))
-
- [1.bin/ ------ 启动器(不是运行逻辑)](#1.bin/ —— 启动器(不是运行逻辑))
- [2.conf/ ------ 容器配置(不是项目配置)](#2.conf/ —— 容器配置(不是项目配置))
- [3.lib/ ------ 容器级依赖](#3.lib/ —— 容器级依赖)
- [4.logs/ ------ 日志](#4.logs/ —— 日志)
- [5.temp/ ------ 临时文件](#5.temp/ —— 临时文件)
- [6.work/ ------ JSP / Servlet 编译产物](#6.work/ —— JSP / Servlet 编译产物)
- [7.webapps/ ------ Web 应用"部署区"(最关键)](#7.webapps/ —— Web 应用“部署区”(最关键))
- 附:
Tomcat保姆级使用教程
Tomcat 及 Servlet 介绍
Servlet 是什么?Tomcat 是什么?
- Servlet 是"规范+接口",规定了Java Web 程序应该长什么样,Tomcat 应该怎么调用你
- Tomcat 是" Servlet 规范的实现者+运行者",是一个程序,负责真正监听端口、接收 HTTP 请求、按照 Servlet 规范调用你的代码
用一条链路把关系钉死
浏览器向 Tomcat 发送 HTTP 请求,Tomcat 按照 Servlet 规范调用你的业务代码
明明有 Spring Boot,为什么要费尽心思使用 Tomcat
事实上,这个问题不是"要不要学Tomcat",而是:你需不需要理解"Spring 是如何被运行起来的"。如果你只想用 Spring 写业务,可以不主动碰Tomcat。如果你想真正理解 Java Web、排查线上问题、往后走得更远,那 Tomcat是绕不开的基础设施层。
Tomcat安装及配置
下载网址:https://tomcat.apache.org/download-90.cgi
笔者用的是Windows系统的9.0.x版本

配置Tomcat


新建项目

完全按照图片创建下述文件

写第一个 Servlet
引入 Servlet API
在 File 中打开 Project Structure

选择依赖jar包

编写 HelloServlet
java
package com.example.web;
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;
/**
* @authore Longan
* @description
*/
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello servlet from IDEA");
}
}
这一步你只需要确定:这个类不是 main 启动的
配置 WEB.XML
编写 web.xml
路径:
src/main/webapp/WEB-INF/web.xml
内容:
xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="4.0">
</web-app>
我们只需要创建一个空壳,因为文件访问路径已经在 HelloServlet 定义了1
配置pom文件
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>servlet-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
在此文件中主要引入servlet依赖jar包
在IDEA中启动 Tomcat
配置 Tomcat Run Configuration


Server标签页

Deployment页



运行 Tomcat
自行在浏览器中输入
http://localhost:8080/servlet-demo/hello
即可看到
hello servlet from IDEA
Tomcat 的项目目录体系(了解加深)
一、Tomcat 眼里的 Web 项目是什么?
在 Tomcat 看来,一个 Web 应用 = 一个 Context。
- 一个 Context
- 对应一个 访问路径(context-path)
- 对应磁盘上的 一个目录或一个 war
例如:
Text
http://localhost:8080/servlet-demo/hello
↑
Context Path
这个 servlet-demo,在 Tomcat 里就是一个 StandardContext。
二、Tomcat 的整体目录结构(容器级)
以本文的 Tomcat 9 为例:
apache-tomcat-9.0.113/
├── bin/
├── conf/
├── lib/
├── logs/
├── temp/
├── webapps/
├── work/
下面逐个讲 "它在干什么"。
1.bin/ ------ 启动器(不是运行逻辑)
bin/
├── startup.bat
├── catalina.bat
├── shutdown.bat
作用:
- 启动 JVM
- 设置 classpath
- 加载 catalina 核心类
bin 不是 Web 应用的一部分 ,你永远不把代码放这里
2.conf/ ------ 容器配置(不是项目配置)
conf/
├── server.xml
├── web.xml
├── context.xml
├── tomcat-users.xml
| 文件 | 作用 |
|---|---|
| server.xml | Tomcat 内核结构(端口、Connector) |
| web.xml | 全局默认 Servlet 规则 |
| context.xml | Context 默认配置 |
| tomcat-users.xml | 管理员账户 |
注意:conf/web.xml ≠ 你项目的 web.xml
它是所有 Web 应用的默认模板
你项目的 web.xml 是"覆盖 / 补充"
3.lib/ ------ 容器级依赖
lib/
├── servlet-api.jar
├── jsp-api.jar
特点:
- 所有 Web 应用 共享
- 对应 Maven 中的 provided
为什么你运行时不用把 servlet-api 打进包?因为 Tomcat 已经在 lib/ 里了
4.logs/ ------ 日志
Tomcat运行时 90% 的线索都在这里。
- catalina.log
- localhost.log
- manager.log
如果浏览器在访问路径时报错,不论是404或500,真相一定在logs里面
5.temp/ ------ 临时文件
- 上传文件
- IO 缓冲
- 可随时删除
6.work/ ------ JSP / Servlet 编译产物
work/
└── Catalina/
└── localhost/
└── servlet-demo/
这里存放的是:
- JSP 编译成的 .java / .class
- Tomcat 运行时生成的中间文件
7.webapps/ ------ Web 应用"部署区"(最关键)
webapps/
├── ROOT/
├── manager/
├── docs/
├── examples/
├── servlet-demo/
每一个子目录 = 一个 Web 应用
| 目录 | 访问路径 |
|---|---|
| ROOT | / |
| manager | /manager |
| servlet-demo | /servlet-demo |
Tomcat 扫描 webapps 来加载应用
附:
Request / Response 由 Tomcat 在一次 HTTP 请求开始时同时创建,请求结束后统一销毁。
Cookie 是客户端的键值对存储,随请求自动携带,通常保存 SessionId;Session 是服务器端的 Map,由 Tomcat 根据 SessionId 管理并绑定到 Request。
转发是服务器内部的资源跳转,只有一次请求,Request 不变;重定向是服务器通知浏览器重新发起请求,会产生新的 Request,URL 会变化。
请求进入 Tomcat 后会先经过 Filter 的前置处理,再进入 Servlet,Servlet 处理完成后回到 Filter 做后置处理,最终由 Tomcat 封装 Response 返回客户端。
Listener 用于监听容器或对象生命周期变化,不参与请求处理。