JSP(JavaServer Pages)は、Javaで動的にHTMLを生成する為の、HTMLのような文法。
及び、それを扱う仕組み。JavaEEの仕様の一部。
|
Javaで動的にHTMLを生成するには、HTTPサーブレットを使う。
しかしサーブレットではプログラムでHTMLの全テキストを出力するような形となる為、HTMLとして分かりづらいし、修正するのも大変。
そこで、サーブレットのプログラムとは独立させて、HTMLと同様なファイルとして記述できるようようにしたのがJSP。
拡張子jspのファイルにHTML(及びJavaプログラムの一部)を書いてJSPコンテナの配下に置くと、JSPコンテナがサーブレットに変換してくれる。
jspファイル内では普通にHTMLが書ける。
その他に「<% 〜 %>」という構文が用意されていて、サーブレットのプログラムの一部を記述できる。
また、XMLと似たような形式のタグを自分で作ることも出来る(カスタムタグ)。
sample.jsp:
<%@ page import="java.util.Date" %> <%@ page contentType="text/html; charset=Shift_JIS" %> <html> <head> <title>サンプル</title> </head> <body> 日付:<%= new Date() %> </body> </html>
サーブレットがプログラムの中にHTMLを埋め込むような形になるのに対し、JSPではHTMLの中にJavaプログラムを埋め込む形になるので、シンプル。
とは言え、大規模なJavaプログラムもJSP内に書けてしまうので、そうなると分かりづらいことに変わりは無い。
なので、JSPではあくまでHTML同様の表現を主とする(Javaに絡むのは、変数の値を出力する程度にする)のがよい。
※実際には、アクションタグ(やStruts)やEL(式言語)を用いるようにして、JSP式(<%= %>)やスクリプトレット(<% %>)は一切使わないようにするのが望ましい。[2010-01-12]
JSPコンテナは、jspファイルを管理するもの。
JSPコンテナがjspファイルをサーブレット(Javaソース)に変換し、javacを用いてコンパイルする。
したがって、JSPで書いても、実際にはサーブレットとして実行されることになる。
(サーブレットと同様の注意点に考慮する必要がある、つまりMTセーフになるようにしなければならないということ)
J2EEサーバー(TomcatやWebLogic)がJSPコンテナの機能を持っている。
jspが実際に使用される際、サーブレットへ変換してさらにコンパイルされる為、そのjspの初回の実行は遅くなる(二度目以降は既にコンパイルされている為、関係ない)。
この為、J2EEサーバーの実装によっては、事前に全て変換・コンパイルする機能がある。(→WebLogicの事前コンパイル)
また、J2EEサーバーの稼動中にjspファイルが新しくなったときに 自動的に再変換・再コンパイルするものもある。
JSPで扱えるデータには、スコープ(データの有効期間・範囲)がある。[2007-09-02]
→暗黙の変数
スコープ | 有効範囲 | 備考(使い道の例) | |
---|---|---|---|
ページ | page | そのJSPページ内 | ページ内のデータ(ループ用のカウンター変数とか) |
リクエスト | request | クライアントへレスポンスを返すまで | フォワード間のデータ受け渡し |
セッション | session | セッションが作られてから破棄されるまで | セッション内(複数画面間)のデータ受け渡し |
アプリケーション | application | ウェブアプリケーション内で共通 | ユーザー全体で共通のアクセスカウンターとか |
スコープ | クライアント1 | → | サーバー | → | クライアント2 | → | サーバー | → | クライアント3 | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
サーブレット1 | → | JSP1 | サーブレット2 | → | JSP2 | ||||||||
ページ(A1) | × | ○ | - | - | |||||||||
ページ(A2) | - | - | × | ○ | |||||||||
リクエスト(A1) | ○ | - | |||||||||||
リクエスト(A2) | - | ○ | |||||||||||
セッション(ユーザーA) | A | ||||||||||||
セッション(ユーザーB) | B | ||||||||||||
アプリケーション | そのウェブアプリにアクセスする全ユーザーで共通 |
したがって、フォワード処理(サーブレット等のロジック担当でデータを用意してJSPで出力する)のデータの受け渡しは“セッション”でなく“リクエスト”で行うべき。
JSPからHTMLへ変換される際、基本的にはjspファイルに書かれたものはそのままHTMLに残る。[2006-04-16]
つまりjspファイル内に書かれているHTMLはそのまま残るし、jspファイル上に書かれた空行や空白もそのまま残る。
アクションタグは(たいてい)HTMLに変換され、スクリプトレット類は変換過程で消えたりするが、
アクションタグやスクリプトレットがあった箇所までの空白(タブ)は残る。
これがどういうことかというと、jspファイル上では綺麗にタブや空白のインデントを入れたとして、変換されたHTMLでは邪魔もの(無意味に見える空行が多発する)になる可能性があるということ。
普通はHTMLの空行は無視されるし そもそもHTML自体を見ることはあまり無いけれど、無駄な転送量は増えるわけで、要注意。
消えると分かっている複数行分のスクリプトレット類を1行内に並べて書けばHTML上の空行は1行だけになるが、
一行の長さがすごいことになるし見ても分かりづらいので、JSPのメンテナンスということを考えるとあまりやりたくないわな。
回避策として、以下のようにスクリプトレット内で改行・字下げするのが常套手段であるらしい。[2007-06-17]
そうすれば、JSPとしては連続した(同一行の)スクリプトレットとして扱われるわけだ。
<% スクリプト %><% スクリプト %><% スクリプト %>
また、JSP2.1からは、pageディレクティブに「空行を削除するかどうか」を制御するフラグが加わったらしい。
<%@page trimDirectiveWhitespaces="true"%>
JavaEEサーバーによっては、trimSpaceを制御するオプションがある。