<%@page%>
SYNOPSIS
| 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 で必要になります。
属 性
この JSP 内のスクリプトレットや評価 (Expression)、宣言構文で使用する言語です。
JSP 2.1 において唯一設定できる値は java (すべて小文字) のみです。
この JSP が生成するページの Content-Type ヘッダおよび送信文字エンコーディングを指定します。以下のコードと等価です。
response.setContentType
(contentType)
省略時はマルチバイト文字が文字化けする ISO-8859-1 でページが送信されてしまうため、日本語の混在するページでは事実上必須です。ページを Shift_JIS で送信する場合は "text/html;charset=Windows-31J"
と指定してください。
この JSP 内で session 変数を使用するかどうかを
true/false で指定します。
true を指定した場合は以下のコードが生成されます。
HttpSession session = request.getSession(true);
この属性に false を指定しているにもかかわらず session
を使用しようとすると JSP コンパイルエラーが発生します。また JSTL
などで session スコープを使用する場合も true にしておく必要があります。
この属性を省略したり true を指定した場合、実際に session
変数を使用するかどうかにかかわらず HTTP セッションが作成されてしまいます。不要なセッションはメモリの無駄であり、クライアント側に無駄な Cookie を発行します。この属性は「まず false、本当に必要なら true」で記述してください。
この JSP ファイルがどのような文字エンコーディングで保存されているかを指定します。
Shift_JIS なら "Windows-31J" と指定して下さい。
Web アプリケーション開発では Shift_JIS 環境の Windows で作成して EUC-JP 環境の Unix で動かすといった事が日常茶飯事に行われているため、ファイルごとに文字エンコーディングを指定できなければいけないという事情があります。
JSP 内のスクリプトレットで使用するクラスのパッケージを宣言します。
Java の通常の import 命令と同じです。
複数のクラスやパッケージを import する場合はコンマ区切りで記述するか、または import を連ねます (この属性だけ例外的に複数指定することが許されています)。
<%@ 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.*
送信バッファサイズを指定します。デフォルトは 8kB のバッファを使用します。これは以下のコードと同じです。
response.setBufferSize
(buffer);
ネットワークの遅さがパフォーマンスネックになっている場合、JSP の出力結果が丸ごと収まる大きさのバッファサイズを指定してやることでパフォーマンスが劇的に改善することがあります (ただしその分サーバのメモリを消費します)。
ページの内容がまだバッファに滞留しているだけの未送信状態であれば、そこまでのレスポンス出力を「リセット」することが出来ます。そして forward 命令はレスポンスをリセットできる必要があります。従ってこのバッファサイズを超えた出力を行った後の forward 命令は必ず失敗します。
サーブレットコンテナレベルでのバッファリングが不要な場合は none を指定します。
バッファフラッシュのタイミングを JSP プロセッサに任せてよいかどうかを true/false
で指定します。
false を指定した場合、プログラムで明示的に <% out.flush();
%> を呼び出す必要があります (バッファが一杯になると IOException が発生します)。また buffer="none" と autoFlush="false" を同時に指定した場合は例外が発生します。
この属性はクライアント側アプリケーションとの取り決めでバッファフラッシュ (送信) のタイミングを完全に JSP で制御する必要がある場合にのみ有用であり、通常は使用する必要はありません。
この JSP 内で例外が発生した場合に forward する別の JSP の URI を指定します。省略された場合は web.xml またはコンテナのレスポンスコード 500 に対応するページが使用されます。
最近では、エラー処理はサーブレットやフィルタなどで一括して行う設計をするためあまり使われていません。
別の JSP から例外で転送され、この属性が true だった場合、元の JSP で発生した例外がスクリプトレット内の暗黙変数 exception
として参照できるようにします。
最近では、エラー処理はサーブレットやフィルタなどで一括して行う設計をするためあまり使われていません。
注意: この属性が提供する機構は Servlet API 2.4 で推奨されないクラスになっている
SingleThreadModel
を使用します。
この JSP をマルチスレッドで実行してよいかどうかを true/false で指定します。
false を指定した場合、JSP (から作成されたサーブレットクラス) のインスタンスが同時に複数のリクエストを処理しないようサーブレットコンテナが制御します。同時アクセス数が多くなるにつれ劇的なパフォーマンス劣化が発生する恐れがあるため、余程の事情がない限り false は指定しないでください。
JSP から Java クラスへ変換する時のスーパークラスの名前を指定します。
一般的な JSP プロセッサは org.apache.jasper.runtime.HttpJspBase
のような固有のスーパークラスを使用するため、むしろ指定すべきではありません。
この JSP の情報を記述します。この文字列は JSP がサーブレットへ変換される時に以下のメソッドの返値として使用されます。特定のサーブレットコンテナの管理コンソールにおいて、実行中のサーブレットを一覧表示する時などに使用されます
Servlet#getServletInfo
()
この 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 では動作したりしなかったり偶発的で不安定です)。
この JSP の文字列リテラルや変換単位で文字シーケンス #{ を許可するかどうかを指定します。false を指定した場合、リテラル中に #{ を検出するとコンパイルエラーが発生します。
使用例
language 属性を付ておきまます。また import は長い羅列になることが多いので個別のディレクティブとして記述します。
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" session="false" %> <%@ page import="java.io.*" %> <%@ page import="java.net.*" %>
<%@ 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 は例外的に同一ディレクティブ内の複数の記述を許可しています)。
<%@ 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 であることを知らせています。
<%@ 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">
...