JavaScript、JSP 与 J2EE:今天应该怎样理解和迁移

这几个名字经常出现在同一个旧式 Java Web 项目里,却不是同一层的东西。JavaScript 是语言;Servlet 与 JSP 是服务器端 Web 规范;J2EE 是平台的历史名称。把它们混为一谈,会让升级范围、依赖关系和安全边界都变得模糊。

本文更新于 2026 年 9 月 1 日。版本状态会变化,实施迁移时仍须重新核对官方规格目录和所选产品的支持矩阵。

一分钟结论

名称 在本文中的含义 通常在哪里运行 主要职责
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 是目录中的正式版本,而后续版本仍标为开发中。此状态会变化。

实施时按以下顺序重新判断:

  1. 官方规格目录确认正式发布状态,不把开发中版本当作生产基线。
  2. 兼容产品目录确认实现声明的规格级别。
  3. 再核对该产品厂商对精确版本、操作系统和 JDK 的支持矩阵及维护期限。
  4. 选择仍接收安全修复、团队可以测试和运维的组合,而不是只追求最大的版本号。

规格仍在线不代表某个具体旧服务器仍获补丁。反过来,应用使用的某个旧 API 名称也不单独证明系统不安全;风险取决于完整运行栈、暴露面、配置和维护状态。

迁移前先做证据清单

不要从全局替换包名开始。先记录:

  • 源代码、构建文件和可重复构建方法是否齐全;当前制品的校验值和部署配置是什么。
  • J2EE、Java EE 或 Jakarta EE 的目标级别;实际 JDK、应用服务器或容器及精确版本。
  • WAR 或 EAR、部署描述符、以 javax.jakarta. 开头的导入、第三方 JAR、厂商扩展和原生库。
  • JSP、标签库、表达式语言、scriptlet、自定义标签,以及 Servlet、过滤器、监听器和 URL 映射。
  • 身份认证、角色与授权、会话、Cookie、JNDI 数据源、持久化、事务、消息、邮件和外部系统。
  • 浏览器 JavaScript 构建链、API 合约、CSP、跨域设置、错误处理和客户端兼容范围。
  • 数据库架构变化、批处理、缓存、排程、队列和任何需要顺序切换的共享状态。
  • 生产流量、关键路径、性能基线、日志中的相关标识,以及不含个人数据和秘密的故障证据。

如果没有源代码、依赖清单、可恢复备份或可重复构建,就应停止直接升级,先恢复这些基本能力。

分阶段迁移,而不是承诺原地跨越

  1. 冻结并重现当前基线;验证备份能在隔离环境恢复,记录功能和性能验收结果。
  2. 根据官方规格、兼容实现和厂商支持矩阵选择目标;建立并行的干净测试环境,不先改生产服务器。
  3. 更新源码、构建插件、部署描述符、属性、依赖和容器为一个受测试的组合。Jakarta EE 9 平台规格明确说明从 javax. 命名空间到 jakarta. 命名空间的迁移造成源代码和二进制不兼容;不要盲目替换所有 javax 名称,因为部分名称属于 Java SE,并未迁移。
  4. 编译并运行单元、集成与安全测试;在预发布环境验证登录、授权、会话、编码、上传、事务、消息、错误页、静态资源和浏览器流程。
  5. 用有限流量或明确维护窗口切换。监控错误率、延迟、资源、数据库与队列状态,并保留可以立即执行的回退负责人和门槛。
  6. 只有验收完成后才停用旧环境;按政策删除临时数据和秘密,保留必要的审计证据。

若需要阶段共存,应让旧 javax 制品与新 jakarta 制品运行在各自受支持且隔离的环境中,并通过稳定接口交互。不要假定一个部署中混用不兼容 API 会被容器自动修复。

回退与停止条件

回退包应包含旧的可验证制品、配置、运行时镜像或安装来源、数据库回退或向前修复方案、流量切换步骤和责任人。先在演练环境证明恢复时间;不能逆转的数据转换必须单独设计兼容窗口,不能只写“恢复备份”。

出现以下任一情况就停止上线:无法重现当前版本;备份未验证;目标组合不在规格与厂商支持范围内;关键依赖没有来源或许可记录;认证、授权、输出编码或会话测试失败;数据库变更没有可行恢复路径;监控与回退负责人未就位。

常见误解

  • “JSP 就是 JavaScript。” 不是。前者是服务器端页面规格,后者是编程语言。
  • “JSP 在浏览器执行。” 不是。服务器处理 JSP,浏览器接收生成的响应;响应中可以另含 JavaScript。
  • “JSP 只是文本,所以不涉及 Servlet。” 现行规格明确规定其运行时页面对象是 Servlet。
  • “把 J2EE 全部改名为 Jakarta EE 就完成升级。” 不是。名称历史、命名空间迁移、规格级别和产品升级是不同工作。
  • “Jakarta EE 等同于某个应用服务器或某个框架。” 不是。它是规格平台;兼容产品实现规格,框架可能只使用其中一部分。
  • “浏览器验证过就安全。” 不是。浏览器由用户控制,服务器必须独立验证和授权。

官方资料

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。

Leave a Reply