Skip to content

核心概念:

  1. Servlet: Java 编写的服务器端程序,用于处理 HTTP 请求和生成响应。它是 Java Web 应用的基础。
  2. JSP (JavaServer Pages): 一种技术,允许在 HTML 页面中嵌入 Java 代码片段 (<% ... %>) 和标签,最终会被 Web 容器编译成 Servlet 执行。主要用于简化动态网页的生成(视图层)。现在更推荐使用模板引擎(如 Thymeleaf, FreeMarker)或前端框架。
  3. Java EE (Java Platform, Enterprise Edition): 一套基于 Java SE 的标准平台规范,用于开发和部署企业级、分布式、可移植、健壮、安全且可伸缩的应用程序。它包含了 Servlet、JSP 以及 EJB、JMS、JPA、CDI 等众多企业级 API 的规范。
  4. Jakarta EE: Java EE 的延续和未来。由于商标和许可问题,Oracle 将 Java EE 移交给了 Eclipse 基金会。Eclipse 基金会将其重命名为 Jakarta EE。它是 Java EE 8 之后所有新版本的标准名称。

一、 Servlet 版本历史

Servlet 规范定义了 Servlet 的生命周期、API 和与容器的交互方式。版本号通常反映了功能的重大演进。

版本号发布时间主要新特性/里程碑意义对应 Java EE 版本
1.01997 (Sun)最初的规范。-
2.0???
2.1?首次成为 JCP 规范。?
2.21999.08 (JCP)引入了 WAR 文件格式。J2EE 1.2
2.32001.08 (JCP)引入了 Filter、应用生命周期事件监听器。J2EE 1.3
2.42003.11 (JCP)基于 XML 的部署描述符 (web.xml)。对 JSP 规范有重大依赖更新。J2EE 1.4
2.52005.09 (JCP)支持 Java 5 注解 (@WebServlet, @WebFilter, @WebListener),减少对 web.xml 的依赖。需要 JDK 5。Java EE 5
3.02009.12 (JCP)重大更新: - 异步处理 (AsyncContext)。 - 可插拔性 (web-fragment.xml)。 - 注解增强。 - 动态注册组件 (ServletContext API)。Java EE 6
3.12013.05 (JCP)当前主流版本: - 非阻塞 I/O (处理文件上传、大请求等更高效)。 - HTTP 协议升级 (如 WebSocket)。 - @ServletSecurity 注解增强。Java EE 7
4.02017.09 (JCP)- 强制要求支持 HTTP/2。 - 服务器推送。 - Servlet 映射规则更灵活。 - GenericFilter 类。Java EE 8
5.02020.10 (EF)首个 Jakarta EE 9 下的 Servlet 规范: - 包名从 javax.servlet 改为 jakarta.servlet - 功能上基本与 4.0 一致,主要是包名迁移。Jakarta EE 9
6.02022.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.14.0 是目前生产环境中最广泛使用的版本。6.0 是 Jakarta EE 10 的当前版本。
  • 容器实现: Tomcat, Jetty, Undertow, GlassFish, Payara, WildFly 等都实现了 Servlet 规范。

二、 JSP 版本历史

JSP 规范定义了 JSP 的语法、语义、编译和执行方式。随着 Web 开发模式的变化(MVC、前端框架、模板引擎兴起),JSP 的使用在减少,但其历史版本仍很重要。

版本号发布时间主要新特性/里程碑意义对应 Java EE 版本
1.01999 (Sun)最初的规范。-
1.1???
1.22001.08 (JCP)与 Servlet 2.3 一起发布。引入了 JSTL (JavaServer Pages Standard Tag Library) 1.0 的基础。J2EE 1.3
2.02003.11 (JCP)重大更新: - 引入 JSP 2.0 表达式语言 (EL) (简化页面逻辑)。 - 引入 SimpleTag 扩展机制 (替代 Tag, IterationTag, BodyTag)。 - web.xml 中可配置 EL 开关。J2EE 1.4
2.12005.09 (JCP)- EL 增强 (函数调用 fn:...)。 - JSP 作为 JSF 的视图技术。 - 统一了 JSP EL 和 JSF EL。Java EE 5
2.22009.12 (JCP)- 支持将页面片段作为参数传递给标签文件。 - web.xml 版本升级到 3.0。 - 对 jsp:attribute 的增强。Java EE 6
2.32013.05 (JCP)功能稳定版本: - 要求支持 EL 3.0 (Lambda 表达式, 集合操作)。 - 引入了新的部署描述符 jsp-config 元素 (<include-prelude>, <include-coda>)。Java EE 7
2.3.12017.09 (JCP)维护性版本,与 Java EE 8 一起发布。功能上基本等同于 JSP 2.3。Java EE 8
3.02020.10 (EF)首个 Jakarta EE 9 下的 JSP 规范: - 包名从 javax.servlet.jsp 改为 jakarta.servlet.jsp - 功能上基本与 2.3.1 一致,主要是包名迁移。Jakarta EE 9
3.12022.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 等)。

平台名称版本号发布时间主要新特性/里程碑意义包含的核心规范版本 (示例)
J2EE1.21999.12 (Sun)首个正式版本。包含 EJB 1.1, Servlet 2.2, JSP 1.1, JMS 1.0, JTA 1.0 等。Servlet 2.2, JSP 1.1
1.32001.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.42003.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 EE52006.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.2Servlet 2.5, JSP 2.1
62009.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
72013.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.0Servlet 3.1, JSP 2.3
82017.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 EE82019.09 (EF)过渡版本: - 功能等同于 Java EE 8。 - 包名仍为 javax.\*。 - 由 Eclipse 基金会管理。目标是让社区和供应商顺利过渡。Servlet 4.0 (javax), JSP 2.3 (javax)
92020.11 (EF)划时代变革: - 包名从 javax.\* 改为 jakarta.\*。 - 功能上基本等同于 Jakarta EE 8 / Java EE 8。 - 主要目标是大规模包名迁移,为后续创新铺路。 - 二进制不兼容Servlet 5.0 (jakarta), JSP 3.0 (jakarta)
9.12021.05 (EF)小幅更新: - 允许在同一个应用中混合使用 javax.*jakarta.* 命名空间(通过转换工具)。 - 主要是解决迁移中的实际问题。Servlet 5.0 (jakarta), JSP 3.0 (jakarta)
102022.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)

重要说明:

  1. javax.* -> jakarta.*: Jakarta EE 9 是分水岭。Java EE 8 及之前的所有版本使用 javax.* 包名。Jakarta EE 9 及之后的所有版本使用 jakarta.* 包名。 这是最重要的兼容性断点。
  2. Java EE 的终结: Java EE 8 是 Oracle 发布的最后一个官方 Java EE 版本。 Oracle 将 Java EE 移交给了 Eclipse 基金会。
  3. Jakarta EE 的诞生: Eclipse 基金会接手后,由于商标限制,不能继续使用 "Java" 品牌,故将其重命名为 Jakarta EE
  4. Jakarta EE 8: 功能等同于 Java EE 8,包名仍是 javax.*,旨在为迁移提供基线。
  5. Jakarta EE 9: 核心任务是完成 javax.*jakarta.* 的大规模包名迁移,功能基本未变。
  6. Jakarta EE 10: 首个在包名迁移基础上进行实质性功能创新的版本(CDI-Lite, Core Profile, 依赖 Java 11)。
  7. Jakarta EE 11: 展望未来,进一步拥抱现代 Java 和云原生。
  8. 实现: GlassFish (参考实现), Payara Server (GlassFish 分支), WildFly (原 JBoss AS), TomEE (Tomcat + EE APIs), OpenLiberty (IBM) 等都是 Jakarta EE 的兼容实现。
  9. MicroProfile: 与 Jakarta EE 并行发展的项目,专注于微服务架构下的 Java 企业级能力(配置、容错、度量、健康检查、分布式追踪、JWT 传播等)。两者在 Jakarta EE 10+ 中开始更紧密地协作和集成。

总结与建议:

  1. 学习/理解历史: Servlet 和 JSP 是理解 Java Web 开发基础的关键。了解 Java EE 到 Jakarta EE 的演变对于理解当前生态至关重要。
  2. 新项目技术选型:
    • Web 层: 强烈建议使用 现代模板引擎 (Thymeleaf, FreeMarker)纯前端框架 (React, Vue, Angular) 替代 JSP。Servlet 作为基础请求处理层仍然核心。
    • 平台: 新企业级项目应直接基于 Jakarta EE (10 或未来的 11)。它代表了未来,拥有活跃的社区和创新。
  3. 维护旧项目:
    • 需要明确项目当前使用的 Java EE / Jakarta EE 版本Servlet/JSP 版本
    • 如果还在 javax.* 命名空间 (Java EE 8 或更早),升级到 Jakarta EE 需要面对包名迁移的挑战,需谨慎评估和计划。Jakarta EE 9.1 提供了一些过渡辅助。
    • 很多旧系统可能停留在 Java EE 5/6/7。
  4. 关注 Jakarta EE: 它是 Java 企业级开发的未来发展方向,持续关注其新版本(EE 11)和与云原生、微服务的结合(MicroProfile)。

Released under the MIT License.