JavaServer Pages

Jakarta Pages（JSP）は、Eclipse Foundationが開発している、HTMLやXML内にJavaのコードを埋め込んでおき、Jakarta Servlet上で動作し、Webサーバで動的にWebページを生成してクライアントに返すテンプレートエンジン。

名称は下記の変遷をたどっている。
 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 という名称だった。
 Jakarta EE 11 以降は Jakarta Pages という名称に変わった。

 概要 

Javaのコードは、<%と%>の記号で囲まれた部分に書かれる。HTMLの中にスクリプトが断片的に見えるため、この記法をスクリプトレット () と呼ぶ。これよりプログラムコードをタグに見立てることができるため、プログラムとデザインの棲み分けができる。定義されたカスタムタグライブラリを使用すればスクリプトレットを使わずに独自のタグでコードを埋め込むことができる。

サーブレットの機能のひとつとして実装されている。

サーブレットと違い、HTMLの中でデザイン部分とプログラム部分を分けて書くためにある程度までウェブデザイナの負担を減らすこともできる。また、静的な出力が多い場合に適しているサーブレットでは`println`メソッドが頻繁に現れて、可読性が低下するため。類似技術として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のタグ 名称  タグ  説明 ディレクティブ  <%@ ディレクティブ %> この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 
JSTL（、JSP標準タグライブラリ）は、JSPでよく用いられる標準的な機能を定義したカスタムタグライブラリである。2001年に定義されたJ2EE 1.3において標準仕様の一つとして導入された。

JSTLでは、変数の操作やif文といった標準的な機能を提供するコアライブラリに加え、XMLや国際化、SQLのライブラリ、さらに文字列操作といった関数をまとめたライブラリが提供されている。

 EL式 
EL式（、式言語）は、JSP 2.0で導入された新たな構文で、従来のスクリプトレットに代わってより可読性に優れたJSPファイルを記述できるようにしたもの。EL式はJSPをベースにしたWebアプリケーションフレームワークであるJSFにおいても独自に定義されていたが、後のJSP 2.1, JSF 1.2において一つの仕様に統合され（、統合式言語）、さらに2013年のEL 3.0ではJSPから独立したJava EE 7の仕様の一つとなっている。

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オブジェクト

 歴史 

+ JavaServer Pagesの歴史 バージョン  JSR  リリース日 1.0  1999年6月2日 1.1  1999年12月17日 1.2 53 2001年9月25日 2.0 152 2003年11月24日 2.1 245 2006年5月11日 2.2(2.1 Maintenance Release) 2009年12月10日 2.3(2.1 Maintenance Release2) 2013年6月12日

+ Jakarta Server Pagesの歴史 バージョン  リリース日  プラットフォーム 2.3 2019年8月8日 Jakarta EE 8 3.0 2020年10月21日 Jakarta EE 9 3.1 2022年4月21日 Jakarta EE 10

+ Jakarta Pagesの歴史 バージョン  リリース日  プラットフォーム 4.0 2024年4月1日 Jakarta EE 11

 批判 
「Murach's Java Servlets and JSP」という本は、JSPにJavaコードを埋め込むことは一般的にはやり方だと述べる。より良い手法は、JSPに埋め込まれたバックエンドのロジックをServlet内のJavaコードに移行することである。この場合、Servletは処理を担当し、JSPはHTMLの表示を担当します。これにより、コードを明確な分離ができる。

2000年に、"Java Servlet Programming"の著者であるJason Hunterは、JSPに関するいくつかの「問題点」を述べた。彼はJSPは「Javaプラットフォームにとって最適な解決策ではないかもしれない」と述べる。The Problems with JSP (January 25, 2000)

 脚注 

引用著作


 関連項目 

 Jakarta Servlet
 Jakarta Faces
 Webコンテナ
 アプリケーションサーバ

 外部リンク 
Jakarta Pages 
JavaServer Pages Technology 

Category:Java
Category:ウェブ開発
Category:テンプレートエンジン
Category:Java specification requests
Category:Java enterprise platform
Pages