JavaServer Pages
HTML内にJavaのコードを埋め込んでおき、Webサーバで動的にWebページを生成してクライアントに返す技術
From Wikipedia, the free encyclopedia
Jakarta Pages(JSP)は、Eclipse Foundationが開発している、HTMLやXML内にJavaのコードを埋め込んでおき、Jakarta Servlet上で動作し、Webサーバで動的にWebページを生成してクライアントに返すテンプレートエンジン。
| 拡張子 | .jsp |
|---|---|
| MIMEタイプ | application/jsp |
| 初版 | 1999年6月2日 |
| 最新版 | |
| 種別 | テンプレートエンジン |
| 派生元 | HTML、XML |
| ウェブサイト | Jakarta Pages |
名称は下記の変遷をたどっている。
- Java 8 までは Java Platform, Enterprise Edition の一部で JavaServer Pages という名称だった。
- Java 9 以降は Eclipse Foundation の Jakarta EE に移管され、Jakarta EE 8, 9, 10 は Jakarta Server Pages 2.3, 3.0, 3.1 という名称だった。[2]
- Jakarta EE 11 以降は Jakarta Pages という名称に変わった。
概要

Javaのコードは、<%と%>の記号で囲まれた部分に書かれる。HTMLの中にスクリプトが断片的に見えるため、この記法をスクリプトレット (英: scriptlet) と呼ぶ。これよりプログラムコードをタグに見立てることができるため、プログラムとデザインの棲み分けができる。定義されたカスタムタグライブラリを使用すればスクリプトレットを使わずに独自のタグでコードを埋め込むことができる。
サーブレットの機能のひとつとして実装されている。
サーブレットと違い、HTMLの中でデザイン部分とプログラム部分を分けて書くためにある程度までウェブデザイナの負担を減らすこともできる。また、静的な出力が多い場合に適している[3]。類似技術としてPHP、ASP、ASP.NETなどがある。
クライアントからのJSPの実行がリクエストされると、アプリケーションサーバのサーブレットコンテナはJSPソースファイルをサーブレットのソースコードに変換する。そしてさらにそのソースコードをその場でコンパイルして実行し、結果をクライアントに返信する。このため、最初はコンパイルの時間がかかるが、いちどコンパイルが実行されると2回目以降は必要なくなるため、結果としてアクセス速度が早くなる。
カスタムタグライブラリとしては、Javaの標準仕様の一部として定義されたJSTLや、Apache Strutsのようなフレームワークが独自に定義したものがあり、こうしたタグを使用することでより可読性を高めることができる。JSP2.0では、従来のタグハンドラクラスを作成しなくてもカスタムタグライブラリを作成できるタグファイルの仕組みが導入された。タグファイルは、JSPの文法で作成されるファイルで拡張子は .tagとなる。
Model View Controllerアーキテクチャでは、JSPをView、ServletをController、JavaBeansをModelとして用いることが想定されている。
構文
タグ
HTMLの中に以下の特殊タグを記述することができる。
| 名称 | タグ | 説明 |
|---|---|---|
| ディレクティブ | <%@ ディレクティブ %> | このJSPファイルの処理時の属性をWebコンテナに伝える |
| 宣言 | <%! 宣言 %> | JSPで使用する変数やメソッドを宣言する |
| スクリプトレット | <% Javaコード %> | タグ内にJavaのコードを自由に記述する |
| 式 | <%= 式 %> | 式の評価結果をHTMLの中に出力する |
| アクション | <jsp:アクション名> | JSPでよく行う処理をタグで簡潔に記述する |
| コメント | <%-- コメント --%> | JSPとしてのコメントを記述する |
ディレクティブ
ディレクティブの種類としては、以下のものがある。
| 名称 | 説明 | 例 |
|---|---|---|
| page | JSPファイルのエンコーディングやJSPプログラムのコーディングに必要なimport文、セッション管理を行う | <%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> |
| include | テキストファイルやその他のJSPファイルをインクルードする。インクルードは、JSPからServletに変換される時に行われる。ファイルの拡張子としてJSPを使用せずに他の拡張子を使用する。一般的には、「.jspf」(JSP Fragment)が使用される。 | <%@ include file="header.jspf" %> |
| taglib | カスタムタグを使用できるようにするための設定を行う | <%@ taglib uri="http://www.sample.com/tags/test" prefix="tst" %> |
アクション
アクションの種類としては、以下のものがある。
- jsp:include
- jsp:param
- jsp:forward
- jsp:plugin
- jsp:fallback
- jsp:getProperty
- jsp:setProperty
- jsp:useBean
JSP2.0では、以下のものが追加になった。
- jsp:attribute
- jsp:body
- jsp:doBody
- jsp:invoke
- jsp:element
暗黙オブジェクト
Javaのコード中で以下の変数があらかじめ利用できる状態(暗黙オブジェクトとして)で用意されている。
| 変数名 | 説明 |
|---|---|
| out | jakarta.servlet.jsp.JspWriterクラスのオブジェクト変数 |
| request | jakarta.servlet.http.HttpServletRequestクラスのオブジェクト変数 |
| response | jakarta.servlet.http.HttpServletResponseクラスのオブジェクト変数 |
| pageContext | jakarta.servlet.jsp.PageContextクラスのオブジェクト変数 |
| session | jakarta.servlet.http.HttpSessionクラスのオブジェクト変数 |
| application | jakarta.servlet.ServletContextクラスのオブジェクト変数 |
| config | jakarta.servlet.ServletConfigクラスのオブジェクト変数 |
| page | jakarta.servlet.jsp.HttpJspPageクラスのオブジェクト変数 |
| exception | java.lang.Throwableクラスのオブジェクト変数 |
JSTL
EL式
EL式(Expression Language、式言語)は、JSP 2.0で導入された新たな構文で、従来のスクリプトレットに代わってより可読性に優れたJSPファイルを記述できるようにしたもの。EL式はJSPをベースにしたWebアプリケーションフレームワークであるJSFにおいても独自に定義されていたが、後のJSP 2.1, JSF 1.2において一つの仕様に統合され(Unified EL、統合式言語)、さらに2013年のEL 3.0ではJSPから独立したJava EE 7の仕様の一つとなっている。[6]
Expression Languageは、${}で表現する。
${sessionScope.user.id}
Expression Languageでは、以下のような暗黙オブジェクトが利用できる。
| 変数名 | 説明 |
|---|---|
| pageContext | jakarta.servlet.jsp.PageContextクラスのオブジェクト変数 |
| pageScope | pageスコープからオブジェクトを取得 |
| requestScope | requestスコープからオブジェクトを取得 |
| sessionScope | sessionスコープからオブジェクトを取得 |
| applicationScope | applicationスコープからオブジェクトを取得 |
| param | リクエストパラメータを格納するMapオブジェクト |
| paramValues | 複数の値を持つリクエストパラメータを格納するString型配列 |
| header | リクエストヘッダーと値を格納するMapオブジェクト |
| headerValues | 複数の値を持つリクエストヘッダーを格納するString型配列 |
| cookie | クッキーを格納するMapオブジェクト |
| initParam | コンテクスト初期化パラメータを格納するMapオブジェクト |
歴史
批判
「Murach's Java Servlets and JSP」という本は、JSPにJavaコードを埋め込むことは一般的にはやり方だと述べる。より良い手法は、JSPに埋め込まれたバックエンドのロジックをServlet内のJavaコードに移行することである。この場合、Servletは処理を担当し、JSPはHTMLの表示を担当します。これにより、コードを明確な分離ができる。[11]
2000年に、"Java Servlet Programming"の著者であるJason Hunterは、JSPに関するいくつかの「問題点」を述べた。彼はJSPは「Javaプラットフォームにとって最適な解決策ではないかもしれない」と述べる。[12]