这几个名字经常出现在同一个旧式 Java Web 项目里,却不是同一层的东西。JavaScript 是语言;Servlet 与 JSP 是服务器端 Web 规范;J2EE 是平台的历史名称。把它们混为一谈,会让升级范围、依赖关系和安全边界都变得模糊。
本文更新于 2026 年 9 月 1 日。版本状态会变化,实施迁移时仍须重新核对官方规格目录和所选产品的支持矩阵。
Table of Contents
一分钟结论
| 名称 | 在本文中的含义 | 通常在哪里运行 | 主要职责 |
|---|---|---|---|
| JavaScript | 由 ECMAScript 规范定义核心的编程语言;这里主要指浏览器 JavaScript | 浏览器,也可存在于其他宿主环境 | 页面行为、调用 HTTP API、在客户端渲染 |
| Jakarta Servlet | 服务器端请求与响应 API 及容器契约 | Servlet 容器或 Jakarta EE 实现 | 接收 HTTP 请求、调用服务、生成响应 |
| Jakarta Pages(JSP) | 当前正式规范中的服务器端模板技术 | 支持该规范的服务器容器 | 用模型生成 HTML;页面会被转换为 Servlet 实现类 |
| Jakarta EE | 一组企业级 Java 规格及其平台与 Profile | 兼容实现之上 | 组合 Web、依赖注入、持久化、事务、消息等能力 |
| J2EE | Jakarta EE 早期谱系中的历史平台名称 | 遗留系统和旧文档 | 描述当时的平台版本,不是现代产品名 |
JavaScript 不是 Java。JSP 也不是一门可以与 JavaScript 对位比较的客户端语言。它们能够在同一个请求中协作,但不能互相替代。
名称为什么变了
| 时期 | 官方名称 | 迁移含义 |
|---|---|---|
| 早期版本 | J2EE | 旧代码、书籍和部署描述中仍会出现 |
| 2006 年起 | Java EE | Oracle 的命名说明记录了从 J2EE 5.0 到 Java EE 5 的改名 |
| 2018 年起 | Jakarta EE | Java EE 转交 Eclipse Foundation 后采用的新名称 |
| Jakarta EE 9 起 | javax. 命名空间转为 jakarta. |
这不是只改品牌;平台规格明确指出源代码和二进制不兼容,需要协调迁移 |
“J2EE 应用”可以继续作为遗留系统的历史描述,但新设计和当前规格应使用 Jakarta EE 的名称。不要仅为了改文档就盲目更改导入;真正从 javax. 命名空间迁移到 jakarta. 命名空间,是一个需要构建、依赖、容器和测试共同配合的工程。
JavaScript:语言,不只是浏览器标签
ECMAScript 语言规范定义 JavaScript 核心语言。浏览器再提供 DOM、Fetch 等宿主 API。服务器运行时也能执行 JavaScript,因此“JavaScript 只运行在客户端”并不准确;本文只是聚焦浏览器中的用法。
浏览器 JavaScript 可以读取用户界面、发起 HTTP 请求并呈现返回数据,但客户端提交的值可被修改或绕过。身份认证、授权、业务约束和最终输入验证必须由服务器执行。JavaScript 与 Java 名称相似,却是不同语言和生态。
Servlet:HTTP 边界
Jakarta Servlet定义处理服务器端 HTTP 请求与响应的 API。应用中的 Servlet、过滤器和监听器由兼容容器管理。它们可以调用服务层、持久化或消息组件,再返回 HTML、JSON 或其他响应。
Servlet 是规范概念;具体应用服务器或 Servlet 容器是实现产品。只知道“用了 Servlet”还不足以判断支持状态,必须记录实现产品、精确版本、JDK、规格级别和厂商支持期限。
Jakarta Pages(JSP):服务器端模板
JSP 的现行规范名是 Jakarta Server Pages,规格目录中也简称 Jakarta Pages。JSP 缩写仍出现在官方规格中,因此它不是一个需要从旧文档中抹掉的词。
Jakarta Pages 用于生成动态 Web 内容。规范说明,页面在运行时对应一个 Servlet 对象,实现类实现 jakarta.servlet.Servlet,请求按 Servlet 规则交付。实务上应把它当作视图模板:控制器准备模型,页面通过表达式语言和受支持的标签库输出 HTML。不要把数据库访问、权限判断或大量 Java scriptlet 塞进页面。
Jakarta EE:平台,不是单个框架
Jakarta EE 规格目录把 Platform 与 Web Profile、Core Profile 列为总括规格,并列出 Servlet、Pages、REST、Persistence、Transactions、Messaging 等单项规格。项目可以只使用其中一部分;使用 Servlet 或 JSP 不自动等于采用整个平台。
规格定义契约,兼容实现提供运行环境,产品厂商负责其发行版维护。平台版本、单项规格版本、实现产品版本和 JDK 版本是四个不同维度,不能用一个“J2EE 版本”代替全部清单。
一个最小请求流
以下两条响应路径是可选设计:服务器可以用 Jakarta Pages 生成 HTML,也可以让端点返回 JSON,再由浏览器 JavaScript 渲染。一个页面并不必须同时采用两条路径。
Browser: HTML, CSS, JavaScript
|
| HTTP request
v
Jakarta Servlet or Jakarta REST endpoint
|
| calls
v
Service, persistence, messaging
|
| returns a model or JSON
v
Jakarta Pages renders HTML, or browser JavaScript renders JSON
这张图也说明了安全边界:浏览器输入跨过网络后仍是不可信数据;页面模板的输出也必须按 HTML、属性、URL 或脚本等实际上下文正确编码。
选择一种可维护的现代结构
| 结构 | 适合情形 | 必须守住的边界 |
|---|---|---|
| 静态 HTML、CSS 与浏览器 JavaScript | 内容站或客户端逻辑很少的页面 | 不在前端放秘密;需要业务数据时仍使用受保护的服务器 API |
| Servlet 或控制器加 Jakarta Pages | 以服务器渲染 HTML 为主的现有 Java 应用 | 页面只展示模型;减少 scriptlet;服务端验证、授权和上下文输出编码 |
| Jakarta REST 加浏览器 JavaScript | 需要丰富客户端交互并以 JSON 为边界 | 明确 API 身份、授权、CSRF 或跨域策略、输入结构和错误处理 |
| 受支持的其他服务器模板或框架 | 团队与产品支持矩阵更适合另一技术栈 | 不把框架名称当作 Jakarta EE 同义词;确认生命周期、升级路径和依赖来源 |
最简单且能长期维护的结构通常优于为了“现代化”而同时引入多个渲染层。先写清楚页面由谁渲染、状态由谁拥有、权限由谁判断,再选择技术。
安全边界不能交给页面
- 客户端校验只改善体验。依据 OWASP 输入验证指南,服务器仍需对所有不可信输入做语法和语义验证,并在服务端实施授权。
- 输出必须按落点上下文编码。采用模板或框架的自动转义能力,并按 OWASP 跨站脚本防护指南检查例外;不要把未受信任的字符串直接拼进 HTML、属性、URL 或脚本。
- 会话 Cookie、CSRF 防护、安全响应头、TLS、密钥管理和依赖补丁属于部署基线,不会因为使用 JSP 或 JavaScript 自动获得。
- 前端包、Maven 依赖、容器与 JDK 都需要清单、可信来源、漏洞处理和可重复构建。不要从非官方镜像下载旧容器或驱动来“先跑起来”。
怎样选择当前版本
截至本文更新日,官方目录把 Jakarta EE 11 列为正式版本,把 Jakarta EE 12 标为开发中;Jakarta Pages 4.0 与 Servlet 6.1 是目录中的正式版本,而后续版本仍标为开发中。此状态会变化。
实施时按以下顺序重新判断:
- 从官方规格目录确认正式发布状态,不把开发中版本当作生产基线。
- 在兼容产品目录确认实现声明的规格级别。
- 再核对该产品厂商对精确版本、操作系统和 JDK 的支持矩阵及维护期限。
- 选择仍接收安全修复、团队可以测试和运维的组合,而不是只追求最大的版本号。
规格仍在线不代表某个具体旧服务器仍获补丁。反过来,应用使用的某个旧 API 名称也不单独证明系统不安全;风险取决于完整运行栈、暴露面、配置和维护状态。
迁移前先做证据清单
不要从全局替换包名开始。先记录:
- 源代码、构建文件和可重复构建方法是否齐全;当前制品的校验值和部署配置是什么。
- J2EE、Java EE 或 Jakarta EE 的目标级别;实际 JDK、应用服务器或容器及精确版本。
- WAR 或 EAR、部署描述符、以
javax.或jakarta.开头的导入、第三方 JAR、厂商扩展和原生库。 - JSP、标签库、表达式语言、scriptlet、自定义标签,以及 Servlet、过滤器、监听器和 URL 映射。
- 身份认证、角色与授权、会话、Cookie、JNDI 数据源、持久化、事务、消息、邮件和外部系统。
- 浏览器 JavaScript 构建链、API 合约、CSP、跨域设置、错误处理和客户端兼容范围。
- 数据库架构变化、批处理、缓存、排程、队列和任何需要顺序切换的共享状态。
- 生产流量、关键路径、性能基线、日志中的相关标识,以及不含个人数据和秘密的故障证据。
如果没有源代码、依赖清单、可恢复备份或可重复构建,就应停止直接升级,先恢复这些基本能力。
分阶段迁移,而不是承诺原地跨越
- 冻结并重现当前基线;验证备份能在隔离环境恢复,记录功能和性能验收结果。
- 根据官方规格、兼容实现和厂商支持矩阵选择目标;建立并行的干净测试环境,不先改生产服务器。
- 更新源码、构建插件、部署描述符、属性、依赖和容器为一个受测试的组合。Jakarta EE 9 平台规格明确说明从
javax.命名空间到jakarta.命名空间的迁移造成源代码和二进制不兼容;不要盲目替换所有javax名称,因为部分名称属于 Java SE,并未迁移。 - 编译并运行单元、集成与安全测试;在预发布环境验证登录、授权、会话、编码、上传、事务、消息、错误页、静态资源和浏览器流程。
- 用有限流量或明确维护窗口切换。监控错误率、延迟、资源、数据库与队列状态,并保留可以立即执行的回退负责人和门槛。
- 只有验收完成后才停用旧环境;按政策删除临时数据和秘密,保留必要的审计证据。
若需要阶段共存,应让旧 javax 制品与新 jakarta 制品运行在各自受支持且隔离的环境中,并通过稳定接口交互。不要假定一个部署中混用不兼容 API 会被容器自动修复。
回退与停止条件
回退包应包含旧的可验证制品、配置、运行时镜像或安装来源、数据库回退或向前修复方案、流量切换步骤和责任人。先在演练环境证明恢复时间;不能逆转的数据转换必须单独设计兼容窗口,不能只写“恢复备份”。
出现以下任一情况就停止上线:无法重现当前版本;备份未验证;目标组合不在规格与厂商支持范围内;关键依赖没有来源或许可记录;认证、授权、输出编码或会话测试失败;数据库变更没有可行恢复路径;监控与回退负责人未就位。
常见误解
- “JSP 就是 JavaScript。” 不是。前者是服务器端页面规格,后者是编程语言。
- “JSP 在浏览器执行。” 不是。服务器处理 JSP,浏览器接收生成的响应;响应中可以另含 JavaScript。
- “JSP 只是文本,所以不涉及 Servlet。” 现行规格明确规定其运行时页面对象是 Servlet。
- “把 J2EE 全部改名为 Jakarta EE 就完成升级。” 不是。名称历史、命名空间迁移、规格级别和产品升级是不同工作。
- “Jakarta EE 等同于某个应用服务器或某个框架。” 不是。它是规格平台;兼容产品实现规格,框架可能只使用其中一部分。
- “浏览器验证过就安全。” 不是。浏览器由用户控制,服务器必须独立验证和授权。
官方资料
- ECMAScript 语言规范
- Jakarta EE 规格目录
- Jakarta Server Pages 4.0 规格
- Jakarta Servlet 规格目录
- Jakarta EE 9 平台规格:命名空间兼容性说明
- Jakarta EE 官方 FAQ:Java EE 转移与命名历史
- Oracle Java 命名说明
- OWASP 输入验证指南
- OWASP 跨站脚本防护指南
2011 年原文存档
以下文本完整保留 source_export 中可见的历史正文,供核对出处。它是惰性纯文本,不是当前建议;其中的旧术语、绝对化陈述和技术概括已由上文纠正。原文目录链接是本页旧的自导航链接,保留在纯文本围栏内,不会作为维护层链接执行。未作删改,也没有隐私或跟踪参数需要遮盖。
Table of Contents
Toggle
- [Javascript, JSP, J2EE的区别](https://blog.lazying.art/en/html/computer_internet/java_j2ee_jsp/476/j2eejspjavascript%e7%9a%84%e5%8c%ba%e5%88%ab.html/#Javascript_JSP_J2EE%E7%9A%84%E5%8C%BA%E5%88%AB)
- [javascript](https://blog.lazying.art/en/html/computer_internet/java_j2ee_jsp/476/j2eejspjavascript%e7%9a%84%e5%8c%ba%e5%88%ab.html/#javascript)
- [jsp](https://blog.lazying.art/en/html/computer_internet/java_j2ee_jsp/476/j2eejspjavascript%e7%9a%84%e5%8c%ba%e5%88%ab.html/#jsp)
- [j2ee](https://blog.lazying.art/en/html/computer_internet/java_j2ee_jsp/476/j2eejspjavascript%e7%9a%84%e5%8c%ba%e5%88%ab.html/#j2ee)
# Javascript, JSP, J2EE的区别
## javascript
是运行在客户端的脚本程序,和java没有任何关系,不属于java的范畴。语法极为灵活,因此javascript极为强大,可以毫不夸张的说:只用html+javascript+xml就可作出asp.net和jsp等才能实现的动态网站。这也是就是现在的ajax。
servlet:说白了就是纯java的程序,只不过是运行在服务器端,需要编译为.class文件,而动态网站的后台逻辑层就是靠servlet实现的。
## jsp
运行在服务器端的动态网页编辑语言,由标记和自定义的标记库组成。jsp是你要实现动态网站所亲手写的代码,jsp会被完全编译为servlet,真正在服务器后台运作的是servlet。
### j2ee
是java的三大平台之一,即:j2ME,j2SE,j2EE。
j2EE包JDBC,JNDI,EJB,RMI,Java IDL/CORBA,JSP,Java Servlet,XML,JMS,JTA,JavaMail,JAF等等。
总之它是个面向企业的平台,与之对应的就是微软的.NET。
