JavaServer Pages
JavaServer Pages(JSP)は、HTML内にJavaのコードを埋め込んでおき、Webサーバで動的にウェブページを生成してクライアントに返す技術のこと。
概要
Javaのコードは、<%
と%>
記号で囲まれた部分に書かれる。HTMLの中にスクリプトが断片的に見えるため、この記法をスクリプトレットと呼ぶ。これよりプログラムコードをタグに見立てることができるため、プログラムとデザインの棲み分けができる。定義されたカスタムタグライブラリを使用すればスクリプトレットを使わずに独自のタグでコードを埋め込むことができる。
サーブレットの機能のひとつとして実装されている。
サーブレットと違い、HTMLの中でデザイン部分とプログラム部分を分けて書くためにある程度までウェブデザイナの負担を減らすこともできる。また、静的な出力が多い場合に適している[1]。類似技術としてPHP, ASP,ASP.NETなどがある。
クライアントからのJSPの実行がリクエストされると、アプリケーションサーバのサーブレットコンテナはJSPソースファイルをサーブレットのソースコードに変換する。そしてさらにそのソースコードをその場でコンパイルして実行し、結果をクライアントに返信する。このため、最初はコンパイルの時間がかかるが、いちどコンパイルが実行されると2回目以降は必要なくなるため、結果としてアクセス速度が早くなる。
Apache Struts、Jakarta Project JSTL(JSP Standard Tag Library)などのJSPカスタムタグライブラリを用いることでスクリプトレットを記述する必要性を無くし開発効率を高めることもできる。
Model View Controllerアーキテクチャでは、JSPをView、サーブレットをControllerとしてシステムを作成することが多い。
構文
タグ
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
暗黙オブジェクト
Javaのコード中で以下の変数が予め利用できる状態(暗黙オブジェクトとして)で用意されている。
変数名 | 説明 |
---|---|
out | javax.servlet.jsp.JspWriterクラスのオブジェクト変数 |
request | javax.servlet.http.HttpServletRequestクラスのオブジェクト変数 |
response | javax.servlet.http.HttpServletResponseクラスのオブジェクト変数 |
pageContext | javax.servlet.jsp.PageContextクラスのオブジェクト変数 |
session | javax.servlet.http.HttpSessionクラスのオブジェクト変数 |
application | javax.servlet.ServletContextクラスのオブジェクト変数 |
config | javax.servlet.ServletConfigクラスのオブジェクト変数 |
page | javax.servlet.jsp.HttpJspPageクラスのオブジェクト変数 |
exception | java.lang.Throwableクラスのオブジェクト変数 |
JSP2.0
JSR152で規定された仕様で従来のスクリプトレットでプログラムを記述するだけでなく、Expression Language(式言語)を導入することで可視性の優れたJSPファイルを記述できるようにしたもの。 Expression Languageは、${}で表現する。
${sessionScope.user.id}
Expression Languageでは、以下のような暗黙オブジェクトが利用できる。
変数名 | 説明 |
---|---|
pageContext | javax.servlet.jsp.PageContextクラスのオブジェクト変数 |
pageScope | pageスコープからオブジェクトを取得 |
requestScope | requestスコープからオブジェクトを取得 |
sessionScope | sessionスコープからオブジェクトを取得 |
applicationScope | applicationスコープからオブジェクトを取得 |
param | リクエストパラメータを格納するMapオブジェクト |
paramValues | 複数の値を持つリクエストパラメータを格納するString型配列 |
header | リクエストヘッダーと値を格納するMapオブジェクト |
headerValues | 複数の値を持つリクエストヘッダーを格納するString型配列 |
cookie | クッキーを格納するMapオブジェクト |
initParam | コンテクスト初期化パラメータを格納するMapオブジェクト |
歴史
バージョン | JSR | リリース日 |
---|---|---|
1.0 | 1999年 | |
1.1 | 2000年 | |
1.2 | 53 | 2001年9月25日 |
2.0 | 152 | 2003年11月24日 |
2.1 | 245 | 2006年5月11日 |
2.2 | 2009年12月10日 |
注釈
- ^ サーブレットではprintlnメソッドが頻繁に現れて、可読性が低下するため