| JSP | |
|---|---|
| ファイル名拡張子 | .jsp、.jspx、.jspf |
| インターネットメディアの種類 | アプリケーション/jsp |
| 開発者 | エクリプス財団 |
| 初回リリース | 1999 (1999) |
| 最新リリース | 4.0 2024年4月9日 (2024-04-09) |
| フォーマットの種類 | 動的ウェブページ |
| 標準 | JSR 245 |
| オープンフォーマット? | はい |
| Webサイト | プロジェクト |
Jakarta Server Pages(JSP、旧称JavaServer Pages)[ 1 ]は、ソフトウェア開発者がHTML、XML、SOAP 、またはその他のドキュメントタイプに基づいて動的に生成されるWebページを作成するのに役立つ技術の集合体です。1999年にサン・マイクロシステムズによってリリースされた[ 2 ] JSPは、PHPやASPに似ていますが、Javaプログラミング言語を使用します。
Jakarta Server Pages を展開して実行するには、 Apache TomcatやJettyなどのサーブレット コンテナーを備えた互換性のある Web サーバーが必要です。

アーキテクチャ的には、JSPはJakartaサーブレットの高レベルな抽象化と見ることができます。JSPは実行時にサーブレットに変換されるため、JSPはサーブレットです。各JSPサーブレットはキャッシュされ、元のJSPが変更されるまで再利用されます。[ 3 ]
Jakarta Server Pagesは、単独で使用することも、サーバーサイドのモデル・ビュー・コントローラ設計のビューコンポーネントとして使用することもできます。通常、モデルにはJavaBeans 、コントローラにはJavaサーブレット(またはApache Strutsなどのフレームワーク)が使用されます。これはモデル2アーキテクチャの一種です。[ 4 ]
JSPを使用すると、Javaコードと特定の定義済みアクションを、HTMLなどの静的なWebマークアップコンテンツに組み込むことができます。生成されたページはサーバー上でコンパイル・実行され、ドキュメントとして配信されます。コンパイルされたページと、それに依存するJavaライブラリには、マシンコードではなくJavaバイトコードが含まれます。他の.jarファイルやJavaプログラムと同様に、コードはJava仮想マシン(JVM)内で実行する必要があります。JVMはサーバーのホストオペレーティングシステムと連携し、抽象的でプラットフォームに依存しない環境を提供します。
JSPは通常HTMLやXML文書を配信するために使用されますが、OutputStreamを使用することで他の種類のデータも配信できます。[ 5 ]
Webコンテナは、request、response、session、application、config、page、pageContext、out、exceptionといったJSP暗黙オブジェクトを作成します。JSPエンジンは、これらのオブジェクトを変換フェーズで作成します。
JSPはスクリプト関数を記述するためにいくつかの区切り文字を使用します。最も基本的な区切り文字は で <% ... %>、JSPスクリプトレットを囲みます。スクリプトレットとは、ユーザーがページをリクエストしたときに実行される Javaコードの一部です[ 6 ] 。
その他の一般的な区切り文字 <%= ... %>には、式の場合(スクリプトレットと区切り文字は式の評価結果に置き換えられます)、およびディレクティブ(で示されます)があります<%@ ... %>。[ 6 ] [ 7 ]
Javaコードは、単一のスクリプトレットブロック内で完結したり自己完結的である必要はありません。ページ全体の構文が正しい限り、マークアップコンテンツをまたいで記述しても構いません。例えば、あるスクリプトレット内で開始されたJavaのif/for/whileブロックは、後続のスクリプトレット内で正しく閉じられなければ、ページは正常にコンパイルされません。そのため、コードが混在し、不適切なプログラミング手法につながる可能性があります。
Javaコードの分割ブロック(複数のスクリプトレットにまたがる)内のコンテンツは、そのコードの影響を受けます。ifブロック内のコンテンツは、if条件がtrueと評価された場合にのみ出力に表示されます。同様に、ループ構造内のコンテンツは、ループ本体の実行回数に応じて、出力に複数回表示されることがあります。
以下は、JSP ページ内の 有効なfor ループです。
<p> 3まで数えます: </p> <% for ( int i = 1 ; i < 4 ; i ++ ) { %> <p>この数は<%= i %>です。</p> <% } %> <p> OK。</p>ユーザーの Web ブラウザに表示される出力は次のようになります。
3つ数えて: この番号は1です。 この番号は2です。 この数字は3です。 わかりました。
JSPuseBeanタグを使用すると、開発者はJavaBeansにアクセスし、作成することができます。[ 8 ]タグ の使用法はuseBeanHTMLタグに似ていますが、JavaBeans用のJSPタグはすべてXML構文を使用します。そのため、タグを含むコードはuseBean大文字と小文字が区別されます。[ 9 ]
このuseBeanタグにはいくつかの属性が含まれています。id属性は、Beanへのアクセスに使用する名前を宣言します。class属性は、Beanのパッケージとクラスを宣言します。属性は、scopeBeanの格納を担当するオブジェクトを宣言します。スコープの値は、Javaアプリケーションの残りの部分でBeanが使用できる期間を定義します。スコープは次の4つの値のいずれかになります。[ 9 ]
pageは、Bean が暗黙的に定義されたPageContextオブジェクト内にあり、現在のページでのみ使用可能であることを意味します。デフォルトでは、すべての Bean のスコープは ですpage。requestは、Bean がHttpServletRequestオブジェクト内に存在することを意味します。この Bean は、現在のリクエストオブジェクトにアクセスできる他のすべての JSP およびサーブレットからアクセスできます。sessionは、Bean がオブジェクト内に存在することを意味しますHttpSession。この Bean は、指定されたオブジェクトにアクセスできる他のすべての JSP およびサーブレットからアクセスできますHttpSession。applicationは、Bean がオブジェクト内に存在することを意味しますServletContext 。この Bean は、指定されたオブジェクトにアクセスできる他のすべての JSP およびサーブレットからアクセスできますServletContext。タグを用いてBeanを作成した後useBean、 タグgetPropertyとsetPropertyタグを用いてBeanのプロパティを取得・設定することができます。JSPはgetProperty作成されたBeanのプロパティを取得するために使用されます。JSPsetPropertyタグはBeanのプロパティを設定するために使用されます。 タグgetProperty とsetPropertyタグでは、name属性を用いてBeanの名前を指定します。そのため、name属性は タグによって提供されるid属性と一致する必要がありますuseBean。[ 10 ]
JSP仕様バージョン2.0では、Javaオブジェクトのデータや関数にアクセスするために用いられる式言語(EL)のサポートが追加されました。JSP 2.1では、ELはJavaServer Facesでも使用されているUnified Expression Language(統合式言語)に組み込まれました。[ 11 ]
JSP式言語は、開発者が特定のリクエストオブジェクトから属性やJavaBeanプロパティを取得できる簡潔な構文を採用しています。ELを使用する場合は、コードの先頭にドル記号("$")を追加する必要があります。ドル記号の後には開き括弧("{")と閉じ括弧("}")が続きます。そして、開き括弧と閉じ括弧の間にコードを記述します。[ 12 ]
以下は EL構文の例です。
variableオブジェクト内の の値はjavabeanです${javabean.variable}。
JSP構文では、JSPアクションと呼ばれる追加のタグを追加して、組み込み機能を呼び出すことができます。[ 7 ]さらに、この技術では、標準のJSP構文の拡張として機能するカスタムJSPタグライブラリを作成することができます。[ 13 ]そのようなライブラリの1つがJSTLです。[ 14 ]
Jakarta標準タグライブラリ(JSTL)は、JSPで実行する必要がある一般的なタスクをサポートしています。[ 15 ]例としては、反復処理と条件文(Javaの「for」および「if」ステートメントに相当)が含まれます。[ 14 ]
JSTLのすべてのライブラリの中で、JSTLコアライブラリが最もよく使用されています。JSTLコアライブラリのURIをプレフィックス付きで指定するには、taglibディレクティブを使用する必要があります。プレフィックスには様々な選択肢がありますが、このライブラリでは「c」プレフィックスが一般的に使用されています。[ 16 ]
JSPページは完全に有効なXML構文で記述することもできます。[ 17 ]このようなJSPファイルは一般的に代替.jspxファイル拡張子を使用し、通常はアプリケーションサーバーがXML構文を検証します。
通常のJSP構文は<% ... %>XMLでは有効ではないため、開発者はJSPが提供する代替タグを使用する必要があります。例えば、common<%@ page .. %>ディレクティブはタグとして記述でき、タグライブラリは通常のタグではなくXML名前空間<jsp:directive.page .. />を使用してインポートされます。 <%@ taglib .. %>
JavaServer Pagesコンパイラは、JSPを解析し、実行可能なJavaサーブレットに変換するプログラムです。このタイプのプログラムは通常、アプリケーションサーバーに埋め込まれ、JSPへの初回アクセス時に自動的に実行されますが、パフォーマンス向上のためにページをプリコンパイルしたり、ビルドプロセスの一部としてコンパイルしてエラーをテストしたりすることもあります。[ 18 ]
一部のJSPコンテナは、ページが変更されたかどうかを確認するためにJSPファイルのタイムスタンプをチェックする頻度を設定できます。通常、このタイムスタンプは、ソフトウェア開発中は短い間隔(数秒程度)に設定され、デプロイ済みのWebアプリケーションでは長い間隔(数分程度、あるいは全くチェックしないなど)に設定されます。[ 19 ]
「Murach's Java Servlets and JSP」の著者であるJoel MurachとMichael Urbanによると、JSPにJavaコードを埋め込むのは一般的に悪い習慣です。[ 20 ]より良い方法は、JSPに埋め込まれたバックエンドロジックを のJavaコードに移行することですServlet。[ 20 ]このシナリオでは、 がServlet処理を担当し、JSPがHTMLの表示を担当し、[ 20 ]明確な関心の分離が維持されます。
2000年、「Java Servlet Programming」の著者であるジェイソン・ハンターは、JavaServer Pagesの多くの「問題」について説明しました。[ 21 ]それでも、ハンターはJSPが「Javaプラットフォームに最適なソリューション」ではないかもしれないが、「非Javaソリューションに最も近いJavaソリューション」であると書きました。ここでハンターが言及しているのは、MicrosoftのActive Server Pagesです。後にハンターは自身のサイトに、JSPは2000年以降改善されているという注釈を追加しましたが、競合相手としてApache VelocityとTea(テンプレート言語)も挙げました。[ 21 ]今日では、いくつかの代替手段と、大規模なWebアプリケーションにおける多くのJSP指向のページが技術的負債と見なされています。