Servlet技术详解
Servlet技术详解
⭐以下是针对 Servlet技术的UML图详解(类图 + 时序图 + 活动图)及核心原理介绍。
一、Servlet核心类图(Class Diagram)
classDiagram
class Servlet{
<<interface>>
+init(ServiceConfig config)
+service(ServletRequest req, ServletResponse res)
+destory()
}
class GenericServlet{
+service(ServletRequest req, ServletResponse res)
#log(String msg)
}
class HttpServlet{
+service(HttpServletRequest req, HttpServletResponse res)
+doGet(HttpServletRequest req, HttpServletResponse res)
+doPost(HttpServletRequest req, HttpServletResponse res)
}
class MyServlet{
+doGet(HttpServletRequest req, HttpServletResponse res)
}
class ServletRequest{
<<interface>>
+getParameter(String name)
}
class HttpServletRequest{
<<interface>>
+getHeader(String name)
}
class ServletResponse{
<<interace>>
+getWriter()
}
class HttpServletResponse{
<<interface>>
+setStatus(int sc)
}
Servlet <|-- GenericServlet
GenericServlet <|-- HttpServlet
HttpServlet <|-- MyServlet
ServletRequest <|-- HttpServletRequest
ServletResponse <|-- HttpServletResponse
HttpServlet --> HttpServletRequest : 使用
HttpServlet --> HttpServletResponse : 使用
📌类图解析:
- 核心接口
- Servlet:定义生命周期方法(init、Service、destory)
- ServletRequest | ServletResponse:封装请求/响应基础操作
- 抽象实现层:
- GenericServlet:协议无关的实现(可用于FTP/SMTP)
- HttpServlet:专为HTTP协议设计(实现doGet、doPost等)
- 开发者自定义:
- MyServlet:继承
HttpServlet并重写业务方法
- MyServlet:继承
- HTTP扩展接口:
- HttpServletRequest:添加HTTP专属方法(getHeader、getSession)
- HttpServletResponse:支持HTTP状态码、Cookie等
Note
💡设计思想:通过分层抽象(接口 -> 通用类 -> 协议类 -> 业务类 )实现高扩展性。
二、Servlet请求时序图(Sequence Diagram)
sequenceDiagram
participant Client as 浏览器
participant WebServer as 服务器
participant Container as Servlet容器
participant Servlet as MyServlet
Client ->> WebServer: Http GET /login
WebServer -->> Container: 传递请求
rect rgb(220, 240, 255)
Note over Container: 容器处理阶段
Container -->> Container: 1. 创建HttpRequest/HTTPResponse对象
Container -->> Servlet: 2. service(req, res)
alt 首次调用
Servlet ->> Servlet: init()
end
Servlet -->> Servlet: 3. doGet(req, res)
Servlet -->> Servlet: 4. 业务逻辑处理
Servlet -->> Container: 5. res.getWriter().write("HTML")
end
Container -->> WebServer: 组装HTTP响应
WebServer -->> Client: 200 OK+ HTML内容
📌时序图解析:
请求传递
浏览器 -> Web服务器(如Nginx) -> Servlet容器(Tomcat)
容器预处理
- 创建线程安全的
HttpServletRequest|HttpServletResponse对象 - 匹配
URL到对应的Servlet
- 创建线程安全的
Servlet生命周期
- 首次调用时执行
init()(通常加载配置) - 调用
Service()-> 路由到doGet()或doGet()
- 首次调用时执行
业务处理
- 通过
req获取参数 - 通过
res输出响应(Writer.write())
- 通过
响应返回
容器将响应数据封装为
HTTP报文返回客户端
Warning
关键特性:
- 每个请求在 独立线程中处理(Servlet实例线程安全由容器保证)
Request|Response对象生命周期 = 单次请求
三、Servlet容器活动图(Activity Diagram)
flowchart TD
A[客户端请求] --> B{容器接受请求}
B --> C[创建Request/Response对象]
C --> D{匹配Servlet?}
D --> |是| E[调用service方法]
D --> |否| F[返回404]
E --> G{首次调用?}
G --> |是| H[执行init初始化]
G --> |否| I[直接处理]
H --> I
I --> J[执行doGet/doPost]
J --> K[业务逻辑层处理]
K --> L[Response写入数据]
L --> M[销毁Request/Response]
M --> N[返回响应]
N --> O[结束]
📌活动图解析:
- 请求路由阶段
- 容器解析 URL 路径 -> 匹配
web.xml或 注解配置的Servlet
- 容器解析 URL 路径 -> 匹配
- 初始化检查
- 首次调用时加载
init()(常用来初始化数据库连接)
- 首次调用时加载
- 请求处理核心
- 根据 HTTP 方法分发到
doGet()(GET ->doGet, POST ->doPost) - 开发者在此实现业务逻辑(如验证登录)
- 根据 HTTP 方法分发到
- 资源清理
- 请求结束时销毁
Request/Response对象(非Servlet本身) Servlet实例通常驻留内存直至容器关闭
- 请求结束时销毁
四、Servler技术核心总结
| 维度 | 说明 |
|---|---|
| 核心接口 | Servlet(生命周期)、ServletRequest/Response(数据传输) |
| 运行容器 | Tomcat/Jetty等负责:线程管理、对象创建、URL映射、生命周期调度 |
| 线程模型 | 单例多线程(每个请求对立线程,谨慎处理实例变量共享问题 |
| 配置方式 | 传统 web.xml 或 现代注解(@WebServlet("/login")) |
| 优化实践 | 使用 Filter处理通用逻辑(如编码设置)、Listener监听上下文事件 |
| 典型流程 | 请求 -> 容器创建 req/res -> 调用 service() -> 业务处理 -> 输出响应 -> 销毁临时对象 |
🔥 进阶理解:
Servlet本质是 java对CGI的进化,通过常驻内存 + 线程池解决CGI的进程创建开销问题,成为Java Web技术的基石。