JSPの構造
図1は大まかなJSPの構造と捉えてください。JSPの正確な構造はJSPの構文に則る必要がありますが、基本的なことを捉えるには以下の4つを抑えておけば大丈夫でしょう。JSP 2.0まではELはJSPやJSF(JavaServer Faces)の仕様の一部でしたが、JSP 2.1ではJSPとJSFで統一されており、将来的には独自のJSRになると言われているため、1番上位の要素として挙げています。また、JSP以外の要素はテンプレート・テキストと呼ばれます。

以下、簡単にディレクティブ、式言語、スクリプティング要素、アクションについて説明します。詳しくは、次回実際にWebアプリケーションを開発する際に説明します。
ディレクティブって何?
JSPはJSPコンテナ上に乗っています。ディレクティブとはJSPからJSPコンテナに対し指示を与えるものです。ディレクティブ(directive)が指示(指令)という意味を持つことから、イメージしやすいと思います。具体的には、JSPからServletへの翻訳の仕方、JSPの実行方法の指示を行います。図1に示した以外にも、attribute、tag、variableディレクティブがJSP 2.0から存在します。ただし、これらはタグファイルの中だけで有効なディレクティブのため今回は省略します。
pageディレクティブ
pageとはまさしくJSP pageのことです(蛇足ですが、JSP pageというとJSPの中のpagesとダブるから不要ではないかとよく聞かれますが、トヨタ自動車の自動車と同じことです)。つまり、JSPそのものに関する処理の仕方をコンテナに伝えるものがpageディレクティブです。JSP 2.1の仕様書では次のように記述されています。
<%@ page page_directive_attr_list %>
例としてbufferとautoFlushを記述すると、次のように属性="値"となります。
<%@ page buffer="32kb" autoFlush="true" %>
表2にpage_directive_attr_listの一覧を示します。
| 属性 | 値 |
| language | JSP 2.1ではjavaしか指定できませんが、ResinなどではJavaScriptもサポートしているようです。将来的にjava以外の言語をサポートするために予約されていると思われます。 |
| extends | 普段はあまり使いません。JSPもただのJavaなので継承できます。指定するクラスは、Servletに翻訳された後の親のクラス名です。 |
| import | java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*以外のクラスを使用したい場合に指定します。 |
| session | trueの場合、javax.servlet.http.HttpSessionが使え、falseの場合、使えないことを意味します。 |
| buffer | "none"の場合、JSPで処理されるたびにクライアントに結果が送られます。"none"以外はkb(KBでないことに注意)で指定します。デフォルトは8kbです。 |
| autoFlush | trueの場合、bufferで指定した値を超えると自動的にクライアントに結果が送られます。従って、buffer属性で"none"を指定した場合、論理的に矛盾するためtrueは指定できません。falseの場合、注意しないといけないのはbuffer属性で指定した値を超えてしまうと例外が発生することです。 |
| isThreadSafe | 当属性はdeprecateなので使用すべきではありません。 |
| isErrorPage | trueの場合、自分自身がエラー情報出力用のJSPであることを指定します。 |
| errorPage | JSP内部で例外が発生した場合、isErrorPageが指定されているJSPのURLを指定します。 |
| contentType | 生成されるコンテンツのMIMEタイプとエンコーディングを指定します。 |
| pageEncoding | JSP自身のエンコーディングを指定します。 |
| isELIgnored | trueの場合、式言語は無視されます。falseの場合、式言語は認識され評価されます。 |
| deferredSyntaxAllowedAsLiteral | trueの場合、式言語において、文字列リテラルの遅延評価を許します。falseの場合、許しません。 |
| trimDirectiveWhitespaces | trueの場合、ディレクティブとテンプレート・テキストの間にある空白文字列を削除します。falseの場合、そのままの状態で残ります。つまり、ディレクティブで複数回改行していると複数行の空白行が出力されてしまいます。 |
taglibディレクティブ
tagと言えばテーブルタグやインプットタグなどHTMLタグのことを想像しますが、JSPではHTMLにないタグが用意されています。JSTL(JSP Standard Tag Library)はそれらのタグを集めたものです。またJSPに用意されていなくとも独自にタグを作ることができます。独自に作成するタグをカスタムタグと呼びます。それらをまとめたものがカスタムタグ・ライブラリです。これらのタグを使用することにより、より動的なコンテンツの生成が可能です。JSP 2.1の仕様書では次のように記述されています。
<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>
従って、uriとtagdirはどちらか一方を指定します。表3がtaglibディレクティブの属性一覧です。
| 属性 | 値 |
| uri | web.xml(デプロイメント記述子)にはtaglib要素の子要素としてtaglib-uri要素とtaglib-location要素が存在します。uriはこのtaglib-uriの要素内容を指定します。実際にはこのURIをもとにTLD(tag library descriptor)の名前を検索するために使われます。TLDとは簡単に言えば、タグとその実装を紐付けるための設定ファイルです。 |
| tagdir | JSP2.0から導入された属性で、タグファイルのディレクトリを指定します。 |
| prefix | JSP2.1の仕様書では<myPrefix:myTag>のように記述されています。このmyPrefixを指定します。JSP2.1で使用できないprefixは、
|
includeディレクティブ
includeディレクティブは、JSPの翻訳時にfile属性で指定したリソースに置き換えてくれとJSPコンテナに指示を出すためのものです。リソースはHTMLでもJSPでも構いません。ただし、JSPをインクルードする場合、includeするJSPのディレクティブと矛盾がないようにしなくてはなりません。pageディレクティブのimport属性は累積的な指定ができるため意識しなくてもいいのですが、それ以外のディレクティブは矛盾を起こす可能性があり、矛盾がある場合、JSPの翻訳時にエラーとなります。大きなプロジェクトの場合、includeされるJSPのディレクティブに制約を設けるなどの工夫が必要となります。属性はfileのみで、その値は取り込みたいリソースのパスを指定します。このパスの指定にもルールがあります。コンテキストパスからの絶対パスの場合、"/"で始めます。"/"で始めない場合、includeするJSPからの相対パスを指定します。入門者が意外と悩むところです。JSP 2.1の仕様書では次のように記述されています。
<%@ include file="relativeURLspec" %>
file以外に属性はないため、属性一覧は省略します。
