Java Servlet、JSP、EL、WebSocket关系
详情
时间线
1997 Servlet (基础:定义Web开发的基本玩法)
↓
1999 JSP (在Servlet上加层皮,方便写HTML)
↓
2004 EL (给JSP减负,让代码更好看)
↓
2013 WebSocket(Servlet的扩展,支持实时通信)层级关系:
- Servlet 是地基:所有Java Web技术(Spring MVC、Struts等)底层都基于Servlet
- JSP/EL 是装修:让Servlet生成HTML更方便(现已逐渐被前端框架Vue/React取代)
- WebSocket 是新增功能:扩展了Servlet处理实时通信的能力
如何理解”Tomcat实现了这些规范”?
Java世界采用 “标准制定者” vs “具体实现者” 分离的模式:
| 角色 | 类比 | 责任 |
|---|---|---|
| 规范(JSR) | 建筑图纸 | 只定义接口和方法签名 |
| Tomcat | 施工队 | 提供具体代码实现这些接口 |
| 应用代码 | 住户 | 按规范接口编写,不关心谁家施工 |
具体体现:
@RequestMapping(value = "/markRead")
public @ResponseBody
String markRead(HttpServletRequest request) {
Long noticeId = RequestUtil.getLongValueMust(request, "noticeId");
noticeService.markRead(noticeId);
return JsonUtils.transferJsonResponse(Constants.SUCCESS, Constants.MSG_OPER_SUCCESS);
}
@Transactional(rollbackFor = {RuntimeException.class, Exception.class})
public void markRead(Long noticeId) {
commonNoticeService.markRead(noticeId);
}全景图:
┌─────────────────────────────────────────────────────────────────┐
│ 业务代码( NoticeController ) │
│ - 使用 HttpServletRequest(规范接口) │
│ - 调用 JsonUtils(业务工具) │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────────┐
│ Spring AOP(CGLIB代理) │
│ - 实现:Spring框架 │
│ - 功能:事务管理、日志、权限拦截 │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────────┐
│ Spring MVC(DispatcherServlet) │
│ - 继承:HttpServlet(规范) │
│ - 实现:Spring框架 │
│ - 功能:@RequestMapping解析、参数绑定、返回值处理 │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────────┐
│ Servlet Filter Chain(过滤器链) │
│ - 接口:javax.servlet.Filter(规范) │
│ - 实现:ApplicationFilterChain(Tomcat) │
│ - 功能:Shiro权限、字符编码、WebSocket过滤 │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────────┐
│ Tomcat Valve Chain(阀门链) │
│ - 实现:StandardWrapperValve 等(Tomcat特有,非规范强制) │
│ - 功能:日志、错误报告、认证、上下文管理 │
│ - 关键:StandardWrapperValve.invoke() 调用 servlet.service() │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────────┐
│ CoyoteAdapter(适配器) │
│ - 实现:Tomcat │
│ - 关键:将 org.apache.coyote.Request 转换为 │
│ javax.servlet.http.HttpServletRequest(规范接口) │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────────┐
│ HTTP协议解析(Coyote) │
│ - 实现:Http11Processor(Tomcat) │
│ - 功能:解析HTTP文本为Java对象(非规范,Tomcat自由实现) │
└─────────────────────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────────────────────┐
│ 网络与线程(NIO) │
│ - 实现:NioEndpoint(Tomcat) │
│ - 功能:监听端口、TCP连接、线程池调度 │
└─────────────────────────────────────────────────────────────────┘好处:今天用Tomcat,明天可以无缝换成Jetty/Undertow(其他实现),而代码不用改。
关联网络
演化日志
- v0.1 (2026-01-30):补充关联网络、演化日志
待办事项
- NIO?
- TCP
- 线程池?线程池调度
- Http协议?怎么解析的?
- 适配器是什么意思?
- 过滤器是什么?
- 事务管理?权限拦截?CGLIB代理?AOP?