一、Servlet 规范的提出与制定机构
Servlet 规范是 Java 企业级 Web 开发的核心标准,其制定与演进由以下主体主导:
- 起源与早期制定
- 提出者:最早由 Sun Microsystems(太阳微系统) 的工程师 Pavni Diwanji 主导设计,James Gosling(Java 之父) 早期提出概念雏形。
- 首个版本:Servlet 1.0 于 1997 年 6 月 正式发布,随 Sun 的 Java Web Server(JWS) 一同推出,是首个官方实现。
- 标准化与社区化(JCP 主导)
- 从 Servlet 2.2(1999 年) 开始,规范纳入 J2EE(Java 2 Platform, Enterprise Edition) 体系,由 JCP(Java Community Process,Java 社区流程) 主导标准化制定。
- JCP 通过 JSR(Java Specification Request,Java 规范请求) 流程迭代版本,核心 JSR 如下:
- Servlet 2.3/2.4/2.5:JSR 53 / JSR 154
- Servlet 3.0:JSR 315
- Servlet 3.1:JSR 340
- Servlet 4.0:JSR 369
- 当前归属(Jakarta EE)
- 2017 年后,Java EE 移交 Eclipse 基金会,更名为 Jakarta EE,Servlet 规范随之更名为 Jakarta Servlet,由 Eclipse 社区维护,最新稳定版为 Jakarta Servlet 6.0。
二、Servlet 规范的核心内容
Servlet 规范是一套 接口、生命周期、交互规则与扩展机制 的集合,定义了 Java Web 应用 与 Servlet 容器(如 Tomcat、Jetty、WebLogic) 之间的契约,核心内容如下:
1. 核心 API 接口(必须实现)
规范定义了一组标准接口,开发者实现这些接口即可编写 Web 组件,容器负责实例化与调度:
- Servlet 核心接口
javax.servlet.Servlet:基础接口,定义init()、service()、destroy()生命周期方法。javax.servlet.http.HttpServlet:HTTP 专用实现,封装doGet()、doPost()、doPut()、doDelete()等 HTTP 方法处理逻辑。
- 请求与响应对象
ServletRequest/HttpServletRequest:封装客户端请求(URL、参数、Header、Cookie、Session 等)。ServletResponse/HttpServletResponse:封装服务端响应(状态码、Header、输出流、Cookie 等)。
- 上下文与会话
ServletContext:代表整个 Web 应用的全局上下文,用于应用级数据共享、资源访问。HttpSession:代表用户会话,用于跨请求存储用户状态。
2. 生命周期管理(容器必须遵守)
规范严格定义 Servlet 实例的创建、初始化、服务与销毁流程:
- 加载与实例化:容器启动(
load-on-startup)或首次请求时,加载 Servlet 类并创建 单例实例(默认)。 - 初始化(
init()):实例创建后调用init(ServletConfig),仅执行一次,用于初始化资源。 - 请求服务(
service()):每次请求到达,容器调用service(),多线程并发执行,必须保证线程安全。 - 销毁(
destroy()):容器关闭或应用卸载时调用,仅执行一次,用于释放资源。
3. 部署与配置规范
定义 Web 应用的打包、部署描述符与组件注册规则:
- 打包格式:Web 应用必须打包为 WAR(Web Application Archive) 文件,遵循固定目录结构(
WEB-INF/classes、WEB-INF/lib、WEB-INF/web.xml)。 - 部署描述符:
WEB-INF/web.xml(或注解)是核心配置文件,用于:- 注册 Servlet、Filter、Listener。
- 配置 URL 映射(
<url-pattern>)。 - 初始化参数(
<init-param>)。 - 会话、安全、错误页面等全局配置。
- 注解支持(3.0+):引入
@WebServlet、@WebFilter、@WebListener等注解,可完全替代 web.xml。
4. 扩展机制(Filter & Listener)
规范提供两大扩展点,实现请求拦截与事件监听:
- Filter(过滤器)
- 接口:
javax.servlet.Filter,定义init()、doFilter()、destroy()。 - 作用:在请求到达 Servlet 前、响应返回客户端后,执行统一逻辑(编码转换、权限校验、日志、压缩等),可组成过滤链。
- 接口:
- Listener(监听器)
- 监听 Web 应用生命周期事件:
ServletContextListener(应用启动/销毁)、HttpSessionListener(会话创建/销毁)、ServletRequestListener(请求创建/销毁)等。 - 作用:实现全局初始化、会话管理、资源清理等。
- 监听 Web 应用生命周期事件:
5. 线程模型与并发规则
- 默认模型:单实例多线程——每个 Servlet 仅一个实例,容器用线程池并发调用
service(),成员变量非线程安全。 - 废弃模型:
SingleThreadModel接口(已废弃),容器创建实例池,但无法彻底解决线程安全问题,且开销大。
6. 高级特性(3.0+ 版本新增)
- 异步处理(Async Servlet):支持异步请求处理,释放容器线程,提升高并发场景吞吐量。
- 可插拔性(Web Fragments):第三方库可通过
META-INF/web-fragment.xml自动注册组件,无需修改主web.xml。 - 文件上传(Multipart):原生支持
multipart/form-data类型的文件上传,简化开发。 - 非阻塞 I/O(3.1+):支持
ServletInputStream/ServletOutputStream的非阻塞读写,适配长连接、WebSocket 等场景。 - HTTP/2 支持(4.0+):适配 HTTP/2 协议,提升传输性能。
7. 安全规范
定义 Web 应用的安全约束:
- 基于角色的访问控制(
<security-constraint>)。 - 登录配置(
<login-config>,支持 FORM、BASIC、DIGEST 等认证方式)。 - 数据保密(HTTPS 强制)。
