servlet学习

Servlet

Servlet(Server + Applet) 是运行在 服务器端的 Java 程序
用来接收客户端请求(通常是 HTTP),并返回响应(通常是 HTML/JSON 等)

Servlet是一个处理和响应请求的类,由web容器管理,容器负责接受请求,并调用Servlet

JSP 最终也会被编译成 Servlet。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──────────────┐
│ 浏览器请求 │
└─────┬────────┘
│ (HTTP)
┌─────▼────────┐
│ Web 容器(Tomcat)│
└─────┬────────┘
│ 匹配 URL
┌─────▼────────┐
│ Servlet (Java类) │
│ doGet/doPost │
└─────┬────────┘
│ 生成响应
┌─────▼────────┐
│ 浏览器显示 │
└──────────────┘

tomcat

多层容器组成的 Java Web 容器

1
Server → Service → Connector + Engine → Host → Context → Wrapper → Servlet
层级 组件名称 功能说明
Server 整个 Tomcat 实例(一个 JVM 内可有多个 Service)
Service 负责把“网络连接”和“应用处理”联系起来
Connector 网络通信组件(如 HTTP、AJP)→ 接收请求、交给 Engine
Engine 请求处理引擎,负责根据 Host 和 Context 分发请求
Host 虚拟主机,一个 Host 表示一个域名(例如 localhost
Context Web 应用(对应一个 webapp 文件夹或 .war 文件)
Wrapper 包装单个 Servlet(例如 index.jspLoginServlet

1️⃣ Server

  • 表示整个 Tomcat 实例。
  • 对应配置文件:server.xml 中的 <Server> 标签。

2️⃣ Service

  • 组合 Connector(网络层)Engine(应用层)
  • 一个 Service 可以有多个 Connector,比如 HTTP、AJP。
1
2
3
4
5
6
7
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"/>
<Connector port="8009" protocol="AJP/1.3"/>
<Engine name="Catalina" defaultHost="localhost">
...
</Engine>
</Service>

3️⃣ Connector(连接器)

  • 接收 HTTP 请求,封装成 Request 对象。
  • 交给 Engine 进行处理。
  • 默认的连接器是:
    • org.apache.coyote.http11.Http11NioProtocol
    • 监听端口 8080

4️⃣ Engine(引擎)

  • 处理所有来自 Connector 的请求。
  • 根据请求的 Host(域名)选择合适的虚拟主机。

5️⃣ Host(虚拟主机)

  • 对应域名,例如:
    • localhost
    • myapp.company.com
  • 每个 Host 下面可以有多个 Web 应用(Context)。
1
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

6️⃣ Context(上下文 / 应用)

  • 对应一个 Web 应用(即一个 .war 或文件夹)。
  • 例如:
    • /webapps/demo/ → Context Path = /demo
  • 管理该应用的所有 Servlets、Filters、Listeners。
  • 每个context有独立的类加载器
  • Context 将一个 web 应用(通常是一个 WAR 或 exploded directory)与 Tomcat 的 Host 绑定,提供该应用的运行时配置与资源(如 JNDI DataSource、环境变量、Session 配置、Valve 等)。

7️⃣ Wrapper(Servlet 封装)

  • 封装单个 Servlet 实例。
  • 每个 JSP 页面最终都被封装成一个 Servlet Wrapper。

流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
浏览器请求:http://localhost:8080/demo/login


[Connector] (HTTP/1.1)
↓ 解析HTTP请求
[Engine]

[Host] (localhost)

[Context] (/demo)

[Wrapper] (LoginServlet)

[Servlet 执行 _service()]

生成响应 HTML

返回给浏览器

核心包

模块 包路径 功能
Catalina org.apache.catalina.* Tomcat 的核心容器逻辑(Engine、Host、Context、Wrapper)
Coyote org.apache.coyote.* 网络连接处理(HTTP/AJP 协议栈)
Jasper org.apache.jasper.* JSP 引擎
Juli org.apache.juli.* 日志系统
Naming org.apache.naming.* JNDI 支持

filter

是位于客户端请求与目标资源(Servlet/JSP)之间的组件。它可以在请求到达 Servlet 之前、响应返回浏览器之前执行代码。

是链式调用,可经过多个filter类进行过滤

listener

Listener(监听器) 是用来监听 Web 应用生命周期事件的组件。有点像回调函数,自动触发

当某些事件发生(如应用启动、Session 创建、属性变更等),Tomcat 会自动调用 Listener 中的回调方法。

监听器接口 监听的事件 触发时机
ServletContextListener 应用启动 / 销毁 Web 应用启动时或关闭时
HttpSessionListener Session 创建 / 销毁 用户登录、超时等
ServletRequestListener 请求创建 / 结束 每次 HTTP 请求到达或完成
ServletContextAttributeListener Context 属性变化 调用 setAttribute()
HttpSessionAttributeListener Session 属性变化 Session 内 setAttribute()
ServletRequestAttributeListener Request 属性变化 请求范围内 setAttribute()

servlet学习
https://rpniu.github.io/2025/10/27/servlet学习/
作者
rPniu
发布于
2025年10月27日
许可协议