S-JIS[2007-06-10/2009-12-05] 変更履歴

JSP

JSP(JavaServer Pages)は、Javaで動的にHTMLを生成する為の、HTMLのような文法。
及び、それを扱う仕組み。JavaEEの仕様の一部。


JSPの概要

Javaで動的にHTMLを生成するには、HTTPサーブレットを使う。
しかしサーブレットではプログラムでHTMLの全テキストを出力するような形となる為、HTMLとして分かりづらいし、修正するのも大変。

そこで、サーブレットのプログラムとは独立させて、HTMLと同様なファイルとして記述できるようようにしたのがJSP
拡張子jspのファイルにHTML(及びJavaプログラムの一部)を書いてJSPコンテナの配下に置くと、JSPコンテナがサーブレットに変換してくれる

jspファイル内では普通にHTMLが書ける。
その他に「<% 〜 %>」という構文が用意されていて、サーブレットのプログラムの一部を記述できる。
また、XMLと似たような形式のタグを自分で作ることも出来る(カスタムタグ)。


JSPの記述例

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コンテナが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で出力する)のデータの受け渡しは“セッション”でなく“リクエスト”で行うべき。


生成されたHTMLの空白

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を制御するオプションがある。


サーブレットへ戻る / warファイルへ行く / Java目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま