これらの名前は古い Java Web アプリケーションで一緒に現れますが、同じ層のものではありません。JavaScript は言語、Servlet と JSP はサーバー側 Web 仕様、J2EE はプラットフォームの歴史的名称です。同一視すると、更新範囲、依存関係、セキュリティ境界が曖昧になります。
この記事は 2026 年 9 月 1 日に更新しました。リリース状況は変わるため、実際の移行時には公式仕様一覧と採用製品のサポートマトリクスを再確認してください。
Table of Contents
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 の用語を使います。文書の名称を新しくするだけのために import を一括変更してはいけません。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 の規則で渡されます。実務ではビューのテンプレートとして扱います。コントローラーがモデルを用意し、ページは Expression Language とサポートされるタグライブラリを用いて 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 Input Validation Cheat Sheetに従い、サーバーはすべての信頼できない入力を構文・意味の両面で検証し、サーバー側で認可を強制します。
- 出力は配置先の文脈に合わせてエンコードします。テンプレートまたはフレームワークの自動エスケープを使い、例外を OWASP Cross Site Scripting Prevention Cheat Sheetと照合します。信頼できない文字列を HTML、属性、URL、スクリプトへ直接連結してはいけません。
- セッション Cookie、CSRF 対策、セキュリティレスポンスヘッダー、TLS、秘密管理、依存関係の修正はデプロイ基準です。JSP や JavaScript が自動的に提供するものではありません。
- フロントエンドパッケージ、Maven 依存、コンテナ、JDK には棚卸し、信頼できる来歴、脆弱性対応、再現可能ビルドが必要です。動かすためだけに非公式ミラーから古いコンテナやドライバーを入手してはいけません。
現行リリースの選び方
この記事の更新時点で、公式一覧は Jakarta EE 11 を正式版、Jakarta EE 12 を開発中としています。Jakarta Pages 4.0 と Servlet 6.1 は正式版として掲載され、後続版は開発中です。この状況は変わります。
実施時には次の順で再評価します。
- 公式仕様一覧で正式リリース状況を確認し、開発中の版を本番基準にしない。
- 互換製品一覧で実装が主張する仕様レベルを確認する。
- 次に、正確な製品版、OS、JDK に対する製品ベンダーのサポートマトリクスと保守期間を確認する。
- 最大の版番号だけを求めず、セキュリティ修正を受け、チームがテスト・運用できる組み合わせを選ぶ。
仕様がオンラインに残っていても、特定の旧サーバーが修正を受けているとは限りません。反対に、一つの旧 API 名だけでシステムが危険だと証明されるわけでもありません。リスクはランタイム全体、露出、設定、保守状況で決まります。
移行前に証拠の棚卸しを作る
パッケージ名の一括置換から始めてはいけません。まず次を記録します。
- ソース、ビルドファイル、再現可能なビルド手順が揃っているか。現行成果物のチェックサムとデプロイ設定。
- 想定する J2EE、Java EE、Jakarta EE レベル。実際の JDK、アプリケーションサーバーまたはコンテナと正確な版。
- WAR または EAR、デプロイ記述子、
javax.またはjakarta.で始まる import、第三者 JAR、ベンダー拡張、ネイティブライブラリ。 - JSP、タグライブラリ、Expression Language、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 Input Validation Cheat Sheet
- OWASP Cross Site Scripting Prevention Cheat Sheet
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。
