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?