核心概念:
- Servlet: Java 编写的服务器端程序,用于处理 HTTP 请求和生成响应。它是 Java Web 应用的基础。
- JSP (JavaServer Pages): 一种技术,允许在 HTML 页面中嵌入 Java 代码片段 (
<% ... %>
) 和标签,最终会被 Web 容器编译成 Servlet 执行。主要用于简化动态网页的生成(视图层)。现在更推荐使用模板引擎(如 Thymeleaf, FreeMarker)或前端框架。 - Java EE (Java Platform, Enterprise Edition): 一套基于 Java SE 的标准平台规范,用于开发和部署企业级、分布式、可移植、健壮、安全且可伸缩的应用程序。它包含了 Servlet、JSP 以及 EJB、JMS、JPA、CDI 等众多企业级 API 的规范。
- Jakarta EE: Java EE 的延续和未来。由于商标和许可问题,Oracle 将 Java EE 移交给了 Eclipse 基金会。Eclipse 基金会将其重命名为 Jakarta EE。它是 Java EE 8 之后所有新版本的标准名称。
一、 Servlet 版本历史
Servlet 规范定义了 Servlet 的生命周期、API 和与容器的交互方式。版本号通常反映了功能的重大演进。
版本号 | 发布时间 | 主要新特性/里程碑意义 | 对应 Java EE 版本 |
---|---|---|---|
1.0 | 1997 (Sun) | 最初的规范。 | - |
2.0 | ? | ? | ? |
2.1 | ? | 首次成为 JCP 规范。 | ? |
2.2 | 1999.08 (JCP) | 引入了 WAR 文件格式。 | J2EE 1.2 |
2.3 | 2001.08 (JCP) | 引入了 Filter、应用生命周期事件监听器。 | J2EE 1.3 |
2.4 | 2003.11 (JCP) | 基于 XML 的部署描述符 (web.xml )。对 JSP 规范有重大依赖更新。 | J2EE 1.4 |
2.5 | 2005.09 (JCP) | 支持 Java 5 注解 (@WebServlet , @WebFilter , @WebListener ),减少对 web.xml 的依赖。需要 JDK 5。 | Java EE 5 |
3.0 | 2009.12 (JCP) | 重大更新: - 异步处理 (AsyncContext )。 - 可插拔性 (web-fragment.xml )。 - 注解增强。 - 动态注册组件 (ServletContext API)。 | Java EE 6 |
3.1 | 2013.05 (JCP) | 当前主流版本: - 非阻塞 I/O (处理文件上传、大请求等更高效)。 - HTTP 协议升级 (如 WebSocket)。 - @ServletSecurity 注解增强。 | Java EE 7 |
4.0 | 2017.09 (JCP) | - 强制要求支持 HTTP/2。 - 服务器推送。 - Servlet 映射规则更灵活。 - GenericFilter 类。 | Java EE 8 |
5.0 | 2020.10 (EF) | 首个 Jakarta EE 9 下的 Servlet 规范: - 包名从 javax.servlet 改为 jakarta.servlet 。 - 功能上基本与 4.0 一致,主要是包名迁移。 | Jakarta EE 9 |
6.0 | 2022.05 (EF) | Jakarta EE 10 核心: - 要求最低 Java SE 11。 - 引入 CDI 对齐的 @ServletSecurity 注解 (@TransportProtected )。 - 移除已废弃的 API。 | Jakarta EE 10 |
重要说明:
javax.*
->jakarta.*
: Servlet 5.0 及以后版本,所有 API 的包名前缀从javax.servlet
改为jakarta.servlet
。这是从 Java EE 迁移到 Jakarta EE 最显著的变化,带来了二进制不兼容。- 主流版本: Servlet 3.1 和 4.0 是目前生产环境中最广泛使用的版本。6.0 是 Jakarta EE 10 的当前版本。
- 容器实现: Tomcat, Jetty, Undertow, GlassFish, Payara, WildFly 等都实现了 Servlet 规范。
二、 JSP 版本历史
JSP 规范定义了 JSP 的语法、语义、编译和执行方式。随着 Web 开发模式的变化(MVC、前端框架、模板引擎兴起),JSP 的使用在减少,但其历史版本仍很重要。
版本号 | 发布时间 | 主要新特性/里程碑意义 | 对应 Java EE 版本 |
---|---|---|---|
1.0 | 1999 (Sun) | 最初的规范。 | - |
1.1 | ? | ? | ? |
1.2 | 2001.08 (JCP) | 与 Servlet 2.3 一起发布。引入了 JSTL (JavaServer Pages Standard Tag Library) 1.0 的基础。 | J2EE 1.3 |
2.0 | 2003.11 (JCP) | 重大更新: - 引入 JSP 2.0 表达式语言 (EL) (简化页面逻辑)。 - 引入 SimpleTag 扩展机制 (替代 Tag , IterationTag , BodyTag )。 - web.xml 中可配置 EL 开关。 | J2EE 1.4 |
2.1 | 2005.09 (JCP) | - EL 增强 (函数调用 fn:... )。 - JSP 作为 JSF 的视图技术。 - 统一了 JSP EL 和 JSF EL。 | Java EE 5 |
2.2 | 2009.12 (JCP) | - 支持将页面片段作为参数传递给标签文件。 - web.xml 版本升级到 3.0。 - 对 jsp:attribute 的增强。 | Java EE 6 |
2.3 | 2013.05 (JCP) | 功能稳定版本: - 要求支持 EL 3.0 (Lambda 表达式, 集合操作)。 - 引入了新的部署描述符 jsp-config 元素 (<include-prelude> , <include-coda> )。 | Java EE 7 |
2.3.1 | 2017.09 (JCP) | 维护性版本,与 Java EE 8 一起发布。功能上基本等同于 JSP 2.3。 | Java EE 8 |
3.0 | 2020.10 (EF) | 首个 Jakarta EE 9 下的 JSP 规范: - 包名从 javax.servlet.jsp 改为 jakarta.servlet.jsp 。 - 功能上基本与 2.3.1 一致,主要是包名迁移。 | Jakarta EE 9 |
3.1 | 2022.05 (EF) | Jakarta EE 10 核心: - 要求最低 Java SE 11。 - 移除已废弃的 API。 | Jakarta EE 10 |
重要说明:
javax.*
->jakarta.*
: JSP 3.0 及以后版本,包名前缀从javax.servlet.jsp
改为jakarta.servlet.jsp
。- 主流与现状: JSP 2.x (尤其是 2.3) 是历史悠久的视图技术,仍有大量遗留系统使用。但在新项目中,强烈推荐使用现代模板引擎 (Thymeleaf, FreeMarker) 或纯前端框架 (React, Vue, Angular)。JSP 本身在 Jakarta EE 中主要是为了向后兼容。
- JSTL: JSP 标准标签库通常与 JSP 配合使用,也有自己的版本 (1.0, 1.1, 1.2),现在稳定在 1.2。
三、 Java EE / Jakarta EE 版本历史
这是整个企业级平台的演进。每个版本包含一组特定版本的规范 (Servlet, JSP, EJB, JPA, CDI, JAX-RS 等)。
平台名称 | 版本号 | 发布时间 | 主要新特性/里程碑意义 | 包含的核心规范版本 (示例) |
---|---|---|---|---|
J2EE | 1.2 | 1999.12 (Sun) | 首个正式版本。包含 EJB 1.1, Servlet 2.2, JSP 1.1, JMS 1.0, JTA 1.0 等。 | Servlet 2.2, JSP 1.1 |
1.3 | 2001.09 (Sun) | 引入 J2EE Connector Architecture (JCA) 1.0。包含 EJB 2.0, Servlet 2.3, JSP 1.2, JMS 1.0.2 等。 | Servlet 2.3, JSP 1.2 | |
1.4 | 2003.11 (JCP) | 引入 Web Services (JAX-RPC 1.1)。包含 EJB 2.1, Servlet 2.4, JSP 2.0, JMS 1.1 等。 | Servlet 2.4, JSP 2.0 | |
Java EE | 5 | 2006.05 (JCP) | 简化开发: - 广泛采用注解 (Annotation)。 - Java Persistence API (JPA) 1.0 引入 (替代 EJB CMP)。 - EJB 3.0 简化。 - Web Services (JAX-WS 2.0) 替代 JAX-RPC。 - JavaServer Faces (JSF) 1.2。 | Servlet 2.5, JSP 2.1 |
6 | 2009.12 (JCP) | Profile 和 进一步简化: - Web Profile 诞生 (针对 Web 应用的子集)。 - Contexts and Dependency Injection (CDI) 1.0 引入 (统一依赖注入)。 - Bean Validation 1.0。 - Servlet 3.0 (异步, 注解)。 - JPA 2.0。 - JSF 2.0。 - RESTful Web Services (JAX-RS 1.1)。 | Servlet 3.0, JSP 2.2 | |
7 | 2013.06 (JCP) | HTML5 和 生产力: - Servlet 3.1 (非阻塞 I/O)。 - JAX-RS 2.0 (客户端 API, 异步, 过滤器/拦截器)。 - JMS 2.0 (简化 API)。 - Concurrency Utilities 1.0。 - Batch Applications 1.0。 - JSON Processing (JSON-P 1.0)。 - WebSocket 1.0。 | Servlet 3.1, JSP 2.3 | |
8 | 2017.09 (JCP) | Java EE 的最后一个 Oracle 版本: - Servlet 4.0 (HTTP/2)。 - CDI 2.0 (事件总线, 异步事件)。 - JSON-B 1.0 (JSON 绑定)。 - Security API 1.0。 - JAX-RS 2.1 (服务器发送事件 - SSE)。 - Bean Validation 2.0 (支持 Java 8 类型)。 | Servlet 4.0, JSP 2.3 | |
Jakarta EE | 8 | 2019.09 (EF) | 过渡版本: - 功能等同于 Java EE 8。 - 包名仍为 javax.\* 。 - 由 Eclipse 基金会管理。目标是让社区和供应商顺利过渡。 | Servlet 4.0 (javax), JSP 2.3 (javax) |
9 | 2020.11 (EF) | 划时代变革: - 包名从 javax.\* 改为 jakarta.\* 。 - 功能上基本等同于 Jakarta EE 8 / Java EE 8。 - 主要目标是大规模包名迁移,为后续创新铺路。 - 二进制不兼容。 | Servlet 5.0 (jakarta), JSP 3.0 (jakarta) | |
9.1 | 2021.05 (EF) | 小幅更新: - 允许在同一个应用中混合使用 javax.* 和 jakarta.* 命名空间(通过转换工具)。 - 主要是解决迁移中的实际问题。 | Servlet 5.0 (jakarta), JSP 3.0 (jakarta) | |
10 | 2022.09 (EF) | 首个真正创新的 Jakarta EE 版本: - 要求最低 Java SE 11。 - 引入 CDI-Lite (更小、更快的 CDI 子集)。 - Core Profile 诞生 (比 Web Profile 更小的子集)。 - 规范更新:Servlet 6.0, JSP 3.1, Faces 4.0, CDI 4.0, Persistence 3.1, REST 3.1 等。 - 移除已废弃的 API (如 EJB Entity Beans, JAX-RPC)。 | Servlet 6.0, JSP 3.1 | |
11 | 计划 2024 (EF) | 未来版本: - 预计要求最低 Java SE 17。 - 可能完全移除 javax.* 命名空间支持。 - 进一步推进创新:更现代的云原生特性、更快的启动时间、更小的占用空间、与 MicroProfile 更好的集成等。 | Servlet ? (预计 7.0), JSP ? (预计 4.0) |
重要说明:
javax.*
->jakarta.*
: Jakarta EE 9 是分水岭。Java EE 8 及之前的所有版本使用javax.*
包名。Jakarta EE 9 及之后的所有版本使用jakarta.*
包名。 这是最重要的兼容性断点。- Java EE 的终结: Java EE 8 是 Oracle 发布的最后一个官方 Java EE 版本。 Oracle 将 Java EE 移交给了 Eclipse 基金会。
- Jakarta EE 的诞生: Eclipse 基金会接手后,由于商标限制,不能继续使用 "Java" 品牌,故将其重命名为 Jakarta EE。
- Jakarta EE 8: 功能等同于 Java EE 8,包名仍是
javax.*
,旨在为迁移提供基线。 - Jakarta EE 9: 核心任务是完成
javax.*
到jakarta.*
的大规模包名迁移,功能基本未变。 - Jakarta EE 10: 首个在包名迁移基础上进行实质性功能创新的版本(CDI-Lite, Core Profile, 依赖 Java 11)。
- Jakarta EE 11: 展望未来,进一步拥抱现代 Java 和云原生。
- 实现: GlassFish (参考实现), Payara Server (GlassFish 分支), WildFly (原 JBoss AS), TomEE (Tomcat + EE APIs), OpenLiberty (IBM) 等都是 Jakarta EE 的兼容实现。
- MicroProfile: 与 Jakarta EE 并行发展的项目,专注于微服务架构下的 Java 企业级能力(配置、容错、度量、健康检查、分布式追踪、JWT 传播等)。两者在 Jakarta EE 10+ 中开始更紧密地协作和集成。
总结与建议:
- 学习/理解历史: Servlet 和 JSP 是理解 Java Web 开发基础的关键。了解 Java EE 到 Jakarta EE 的演变对于理解当前生态至关重要。
- 新项目技术选型:
- Web 层: 强烈建议使用 现代模板引擎 (Thymeleaf, FreeMarker) 或 纯前端框架 (React, Vue, Angular) 替代 JSP。Servlet 作为基础请求处理层仍然核心。
- 平台: 新企业级项目应直接基于 Jakarta EE (10 或未来的 11)。它代表了未来,拥有活跃的社区和创新。
- 维护旧项目:
- 需要明确项目当前使用的 Java EE / Jakarta EE 版本 和 Servlet/JSP 版本。
- 如果还在
javax.*
命名空间 (Java EE 8 或更早),升级到 Jakarta EE 需要面对包名迁移的挑战,需谨慎评估和计划。Jakarta EE 9.1 提供了一些过渡辅助。 - 很多旧系统可能停留在 Java EE 5/6/7。
- 关注 Jakarta EE: 它是 Java 企业级开发的未来发展方向,持续关注其新版本(EE 11)和与云原生、微服务的结合(MicroProfile)。