JSP リファレンス

<%@page%>
JSP 1.0 以降

SYNOPSIS

<%@page
language="java"
contentType="text/html;charset=ISO-8859-1|Content-Type値"
session="true|false"
pageEncoding="ISO-8859-1|文字エンコーディング"
import="パッケージ.*|クラス完全限定名"
buffer="8kb|none|出力バッファサイズ"
autoFlush="true|false"
errorPage="URI"
isErrorPage="true|false"
isThreadSafe="true|false"
extends="クラス完全限定名"
info="サーブレット説明"
isELIgnored="true|false"
deferredSyntaxAllowedAsLiteral="true|false"
trimDirectiveWhitespaces="true|false"
%>

説 明

JSP 処理のメタ情報を記述するためのディレクティブです。 JSP の挙動やパフォーマンスを決定する重要な命令が含まれているので一通り理解しておく必要があります (既にほとんど使われていない命令も多いですが) 。

contentType, pageEncoding および session 属性はほとんどの JSP で必要になります。

属 性

language="java"
optional

この JSP 内のスクリプトレットや評価 (Expression)、宣言構文で使用する言語です。 JSP 2.1 において唯一設定できる値は java (すべて小文字) のみです。

contentType="text/html;charset=ISO-8859-1|Content-Type値"
optional

この JSP が生成するページの Content-Type ヘッダおよび送信文字エンコーディングを指定します。 以下のコードと等価です。

response.setContentTypeJava™ API リファレンス(contentType)

省略時はマルチバイト文字が文字化けする ISO-8859-1 でページが送信されてしまうため、 日本語の混在するページでは事実上必須です。 ページを Shift_JIS で送信する場合は "text/html;charset=Windows-31J" と指定してください。

session="true|false"
optional

この JSP 内で session 変数を使用するかどうかを true/false で指定します。 true を指定した場合は以下のコードが生成されます。

HttpSession session = request.getSession(true);

この属性に false を指定しているにもかかわらず session を使用しようとすると JSP コンパイルエラーが発生します。また JSTL などで session スコープを使用する場合も true にしておく必要があります。

この属性を省略したり true を指定した場合、実際に session 変数を使用するかどうかにかかわらず HTTP セッションが作成されてしまいます。不要なセッションは メモリの無駄であり、クライアント側に無駄な Cookie を発行します。 この属性は 「まず false、本当に必要なら true」 で記述してください。

pageEncoding="ISO-8859-1|文字エンコーディング"
JSP 1.1 以降 optional

この JSP ファイルがどのような文字エンコーディングで保存されているか を指定します。 Shift_JIS なら "Windows-31J" と指定して下さい。

Web アプリケーション開発では Shift_JIS 環境の Windows で作成して EUC-JP 環境の Unix で動かすといった事が日常茶飯事に行われているため、 ファイルごとに文字エンコーディングを指定できなければいけないという 事情があります。

import="パッケージ.*|クラス完全限定名"
optional

JSP 内のスクリプトレットで使用するクラスのパッケージを宣言します。 Java の通常の import 命令と同じです。

複数のクラスやパッケージを import する場合はコンマ区切りで記述するか、 または import を連ねます (この属性だけ例外的に複数指定することが許されています)。

JSP
<%@ page language="java" contentType="text/html;charset=UTF-8"
    import="java.util.*, java.io.*"
    import="java.net.*" %>

以下のパッケージは暗黙的に import されています。

javax.servlet.*, javax.servlet.jsp.*, javax.servlet.http.*

buffer="8kb|none|出力バッファサイズ"
optional

送信バッファサイズを指定します。デフォルトは 8kB のバッファを使用します。これは以下のコードと同じです。

response.setBufferSizeJava™ API リファレンス(buffer);

ネットワークの遅さがパフォーマンスネックになっている場合、JSP の出力結果が 丸ごと収まる大きさのバッファサイズを指定してやることでパフォーマンスが劇的に 改善することがあります (ただしその分サーバのメモリを消費します)。

ページの内容がまだバッファに滞留しているだけの未送信状態であれば、そこまでの レスポンス出力を 「リセット」 することが出来ます。そして forward 命令はレスポンスを リセットできる必要があります。従ってこのバッファサイズを超えた出力を行った後の forward 命令は必ず失敗します。

サーブレットコンテナレベルでのバッファリングが不要な場合は none を指定します。

autoFlush="true|false"
optional

バッファフラッシュのタイミングを JSP プロセッサに任せてよいかどうかを true/false で指定します。

false を指定した場合、プログラムで明示的に <% out.flush(); %> を呼び出す必要があります (バッファが一杯になると IOException が 発生します)。また buffer="none"autoFlush="false" を同時に 指定した場合は例外が発生します。

この属性はクライアント側アプリケーションとの取り決めでバッファフラッシュ (送信) のタイミングを完全に JSP で制御する必要がある場合にのみ有用であり、 通常は使用する必要はありません。

errorPage="URI"
optional

この JSP 内で例外が発生した場合に forward する別の JSP の URI を指定します。 省略された場合は web.xml またはコンテナのレスポンスコード 500 に対応するページが 使用されます。

最近では、エラー処理はサーブレットやフィルタなどで一括して行う設計をするためあまり使われていません。

isErrorPage="true|false"
optional

別の JSP から例外で転送され、この属性が true だった場合、 元の JSP で発生した例外がスクリプトレット内の暗黙変数 exception として参照できるようにします。

最近では、エラー処理はサーブレットやフィルタなどで一括して行う設計を するためあまり使われていません。

isThreadSafe="true|false"
optional

注意: この属性が提供する機構は Servlet API 2.4 で推奨されない クラスになっている SingleThreadModelJava™ API リファレンス を使用します。

この JSP をマルチスレッドで実行してよいかどうかを true/false で指定します。 false を指定した場合、JSP (から作成されたサーブレットクラス) のインスタンスが 同時に複数のリクエストを処理しないようサーブレットコンテナが制御します。 同時アクセス数が多くなるにつれ劇的なパフォーマンス劣化が発生する恐れがあるため、余程の事情が ない限り false は指定しないでください。

extends="クラス完全限定名"
optional

JSP から Java クラスへ変換する時のスーパークラスの名前を指定します。

一般的な JSP プロセッサは org.apache.jasper.runtime.HttpJspBase のような固有のスーパークラスを使用するため、むしろ指定すべきではありません。

info="サーブレット説明"
optional

この JSP の情報を記述します。この文字列は JSP がサーブレットへ変換される 時に以下のメソッドの返値として使用されます。特定のサーブレットコンテナの 管理コンソールにおいて、実行中のサーブレットを一覧表示する時などに使用されます

Servlet#getServletInfoJava™ API リファレンス()

isELIgnored="true|false"
JSP 2.0 以降 optional

この JSP 内で EL (Expression Language, 式言語) を無効にするかどうかを 指定します。

JSP 2.0 以降の JSP プロセッサは JSP 内の ${ } を EL として評価します。 このため、それ以前のサーブレットコンテナで動いていた JSP を移行したときに 不具合が発生する可能性があります。この属性を true に設定することで ${ } パターンを EL として評価しなくなるため 1.x の JSP を安全に 移行することができます。

Web アプリケーション全体の EL を無効化するには web.xml でまとめて行った方が簡単です。

なお、コンテキストの web.xml が Servlet API 2.3 以前で宣言されている場合は EL は正しく機能しません (Tomcat 5.5 では動作したりしなかったり偶発的で不安定です)。

deferredSyntaxAllowedAsLiteral="true|false"
JSP 2.1 以降 optional

この JSP の文字列リテラルや変換単位で文字シーケンス #{ を許可するかどうかを 指定します。false を指定した場合、リテラル中に #{ を検出するとコンパイルエラーが 発生します。

trimDirectiveWhitespaces="true|false"
JSP 2.1 以降 optional

<%@page%> などの JSP ディレクティブの間に存在する空白文字を 削除するかどうかを指定します。true を指定した場合、ディレクティブ間の空白、 改行、タブなどは出力されません。

この属性はコンテンツの先頭に改行などがあると内容を正しく認識できない クライアントに対して有効です。

使用例

人によって書き方の癖もあるのですが、とりあえず一番よく見かけるスタイル。 システム運用やファイル管理を行っている人など、システムに携わる全ての人間が JSP が何のファイルなのか知っているとは限らないため、必ず最初に language 属性を付ておきまます。また import は長い羅列になる ことが多いので個別のディレクティブとして記述します。
JSP
<%@ page language="java"
  contentType="text/html;charset=UTF-8"
  pageEncoding="UTF-8" session="false" %>
<%@ page import="java.io.*" %>
<%@ page import="java.net.*" %>
全ての指定を個別の命令で記述することも出来ます。
JSP
<%@ page language="java" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>
<%@ page session="false" %>
<%@ page import="java.io.*" %>
<%@ page import="java.net.*" %>
一つの import にコンマ区切りで複数指定する書き方と、個別の import に 分ける書き方があります (import は例外的に同一ディレクティブ内の複数の記述を許可しています)。
JSP
<%@ page import="java.io.*,java.net.*" %>
<%@ page import="java.io.*" import="java.net.*" %>

Shift-JIS で作成した JSP を Shift-JIS で送信するための正しい記述。 Shift_JIS は NEC/IBM 拡張文字、-、~ などが文字化けするため、 それらを包含した Windows-31J (JDK 1.3 以前は MS932) を 指定します。

ただし Ineternet Explorer は Windows-31J が MS 拡張 Shift-JIS であることを知らないため、偶発的に文字化け (というか誤認識) する可能性があります。 これを防止するために <meta> タグの方で HTML が Shift-JIS であることを 知らせています。

JSP
<%@ page language="java"
    contentType="text/html;charset=Windows-31J"
    pageEncoding="Windows-31J" session="false" %>
...
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS">
...
CVS 2008/03/09