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目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま