Section6: JavaServer Pages(JSP)テクノロジーモデル
JSPにクライアントからの初回リクエストが到着してからの処理シーケンスを答えよ。
シーケンス | |
---|---|
サーブレットコンテナにより、JSPファイルがサーブレットのJavaファイルへ変換される | |
サーブレットコンテナにより、サーブレットのJavaファイルがコンパイルされる | |
サーブレットコンテナにより、サーブレットがインスタンス化される。 | |
サーブレットの初期化メソッド(jspInit())が呼ばれる | |
_jspServiceメソッドが呼ばれる。以後、リクエストがあるたびに_jspServiceメソッドが呼ばれる。 | |
サーブレットの破棄メソッド(jspDestroy())が呼ばれる。 |
- Tomcat5.5以降ではJavaのコンパイラが内蔵されているため、JREでTomcatを動かしていてもJSPは問題なくコンパイルできる。
シグネチャ | 説明 | |
---|---|---|
public void jspInit() | JSPページの初期化時に呼ばれる。このメソッドをオーバーライドする場合は、JSPに宣言<%! ... %>を使ってメソッドを定義する。 | |
public void jspDestroy() | JSPページの破棄時に呼ばれる。このメソッドをオーバーライドする場合は、JSPに宣言<%! ... %>を使ってメソッドを定義する。 |
シグネチャ | 説明 | |
---|---|---|
public void _jspService(HttpServletRequest request, HttpServletResponse response) | JSPへリクエストが来るたびに実行される。JSPに記述されたスクリプトレット(<% .... %>)や式(<%= .... %>)の内容は、このメソッド内に展開されている。 |
要素 | 説明 |
---|---|
JSPの要素 | - |
テンプレートテキスト | HTMLのタグなど、JSPでは処理されずそのままテキストとして出力される要素。 |
ディレクティブ | - |
pageディレクティブ | JSPページ全体の設定情報などを定義する。 |
includeディレクティブ | JSPファイルに別リソースをインクルードする。タグを記述した場所にインクルードされる。 |
taglibディレクティブ | カスタムタグに関する設定を行う。 |
スクリプト要素 | - |
スクリプトレット | Javaによる処理を記述する。 |
宣言 | メソッドやフィールドの宣言を行う。 |
式 | 文字列を出力する。 |
EL(式言語) | EL式を使って演算結果などを出力する。 |
アクションタグ | - |
標準アクションタグ | あらかじめ用意されている、標準的な処理を行うタグ。 |
カスタムタグ | 開発者が実装した、独自の処理を行うためのタグ。 |
コメント | コメントを記述する。 |
種類 | JSP形式タグ | XML形式タグ | |
---|---|---|---|
pageディレクティブ | <%@ page 属性="値" ... %> | <jsp:directive.page 属性="値" ... /> | |
includeディレクティブ | <%@ include file="ファイルパス" %> | <jsp:directive.include file="ファイルパス" /> | |
taglibディレクティブ | <%@ taglib 属性="値" ... %> |
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:プレフィックス="TLDファイルのURI" version="2.1"> </jsp:root> |
- taglibディレクティブをXML形式で記述する場合には、jsp:rootタグのxmlnsで指定する。
属性 | デフォルト値 | 説明 | |
---|---|---|---|
import | java.lang.*, javax.servlet.*, javax.servlet.http.*, javax.servlet.jsp.* | インポートするクラスの指定。カンマ区切りで複数記述可能。 | |
session | true | セッションを有効にするかどうか。falseにすると暗黙オブジェクトのsessionが使用できなくなる。 | |
contentType | text/html; charset=8859_1 | レスポンスのContent-Typeヘッダに出力するMIMEタイプと文字エンコーディングを指定。 | |
pageEncoding | contentTypeで指定されているcharset | このJSPファイルの記述に使用されている文字エンコーディング。 | |
errorPage | なし | 例外が発生した場合に転送するエラーページのパス。"/"から始まる場合はコンテキストルートからの相対ぱす。"/"から始まらない場合は、このJSPファイルからの相対パス。 | |
isErrorPage | false | このJSPがエラーページであるかどうか。trueに設定すると、暗黙オブジェクトのexceptionが使用できるようになる。 | |
autoFlush | true | 自動的に出力バッファをフラッシュするかどうか。 | |
buffer | 8KB | 出力に使用するバッファサイズをKBで指定。バッファリングさせない場合は、「none」を指定する。 | |
language | java | JSPページで使用する言語を指定します。JSP2.1時点ではjavaのみ使用可能。 | |
info | なし | JSPページの情報。ここで設定した情報はServlet#getServletInfo()で取得できる。 | |
extends | サーバの実装依存 | JSPページが継承するクラスを指定。 | |
isELIgnored | false | EL式を無視するかどうか。 | |
deferredSyntaxAllowedAsLiteral | false | 遅延評価のEL式の記法 #{} をリテラル中でただの文字列とみなすかどうかをtrueまたはfalseで指定する。 | |
trimDirectiveWhitespaces | false | 通常ディレクティブ行は空行として出力されるが、この属性がtrueの場合、空行を出力しなくなる。 |
- sessionをfalseにするとsessionの暗黙オブジェクトが使えなくなるが、スクリプトレット内などでrequest.getSession()を呼び出せばsession属性がfalseでもセッションを使用することは可能。(やるべきではないが)
- contentTypeの指定は、内部的にはresponse.setContentType("値")に変換される。
- pageEncodingはJSPの記述されている文字エンコーディング、contentTypeのcharsetはクライアントへレスポンスを返す際に使用される文字エンコーディング。JSPをwindows-31Jで記述し、レスポンスはUTF-8で返すということも可能。
- errorPageで指定されたJSPのisErrorPageがfalseであっても、errorPageへの遷移は行われる。(Tomcat6.0で確認)
属性 | 必須 | 説明 | |
---|---|---|---|
file | ○ | インクルードするファイルのパス。"/"から始まる場合はコンテキストルートからの相対パス、"/"から始まらないときはJSPファイルからの相対パス。インクルードは静的に行われるため、サーブレットをincludeすることはできない。 |
属性 | 必須 | 説明 | |
---|---|---|---|
prefix | ○ | タグの前につけるプレフィクス名。 | |
uri | △ | TLDファイルのURI。 | |
tagdir | △ | タグファイルの格納先ディレクトリ。uri属性とどちらかを指定しなければならない。 |
JSP形式 | XML形式 | |
---|---|---|
<% Javaコード %> | <jsp:scriptlet>Javaコード</jsp:scriptlet> |
- 記述されたJavaコードは_jspServiceメソッド内に展開される。
JSP形式 | XML形式 | |
---|---|---|
<%! フィールド/メソッドの定義 %> | <jsp:declaration>フィールド/メソッドの定義</jsp:declaration> |
- 記述された宣言はJSPから変換されたServletクラスの内部に展開される。
JSP形式 | XML形式 | |
---|---|---|
<%= 式 %> | <jsp:expression>式</jsp:expression> |
- _jspServiceメソッド内のout.printメソッドの引数に展開される。
- 末尾にセミコロンをつけるとエラーとなるので注意。
種類 | 書き方 | 説明 | |
---|---|---|---|
JSPコメント | <%-- ... --%> | クライアントに返すレスポンスにはこのコメントは出力されない。 | |
通常のJavaコメント | <% //コメント %> <% /* コメント */ %> | スクリプトレットや宣言内で通常のJavaコメントを書くこともできる。クライアントに返すレスポンスにはこのコメントは出力されない。 | |
HTMLコメント | <!-- .... --> | サーブレットコンテナはただのテンプレートテキストとみなすため、クライアントに返すレスポンスにコメントがそのまま出力される。 |
- 当然、HTMLコメントを動的に生成するといったこともできる。例: String型変数commentが定義されているときに、<!-- <%= comment %> -->
- Tomcat6.0でJSPコメントを使用した場合、JSPから変換されたサーブレットのソースにもこのコメントは出力されなかった。
- Tomcat6.0で通常のJavaコメントを使用した場合、JSPから変換されたサーブレットのソースにこのコメントが出力された。
名前 | 型 | 説明 | |
---|---|---|---|
pageContext | javax.servlet.jsp.PageContext | ページコンテキストオブジェクト。 | |
request | javax.servlet.http.HttpServletRequest | リクエストオブジェクト。 | |
session | javax.servlet.http.HttpSession | セッションオブジェクト。pageディレクティブのsession属性がfalseの場合は使用不可。 | |
application | javax.servlet.ServletContext | サーブレットコンテキストオブジェクト。 | |
response | javax.servlet.http.HttpServletResponse | レスポンスオブジェクト。 | |
out | javax.servlet.jsp.JspWriter | 出力用のライター。 | |
config | javax.servlet.ServletConfig | サーブレットの設定。初期化パラメータの取得などに使用する。 | |
page | java.lang.Object | JSPから変換されたサーブレット自身を表す。thisと同じ。 | |
exception | java.lang.Throwable | 例外発生時にスローされた例外オブジェクト。例外が発生したときで、pageディレクティブのisErrorPage属性がtrueの場合のみ使用可能。 |
- 暗黙オブジェクトは_jspService()メソッド内のローカル変数として定義される。
- よって、宣言の中では暗黙オブジェクトは使用できない。(宣言はクラス定義直下に展開されるため、_jspService()メソッド内のローカル変数は使えない)
- JSPに初期化パラメータを指定する場合はweb.xmlのservletタグにjsp-fileタグとinit-paramタグを設定する必要がある。
- Tomcatなどで、JSPから変換されたサーブレットのソースを一度は見ておくべき。
タグ | 多重度 | 説明 |
---|---|---|
jsp-property-group | * | 複数のJSPグループに対して共通のプロパティを設定。 |
url-pattern | + | JSPファイルのパターンを指定(*.jspなど)。 |
el-ignored | ? | EL式を無視するかどうか。初期値はfalse。 |
page-encoding | ? | 文字エンコーディングの指定。 |
scripting-invalid | ? | スクリプトレットを無視するかどうか。デフォルトはfalse。 |
is-xml | ? | JSPドキュメント(XML形式のJSP)であるかどうか。デフォルトはfalse。 |
include-prelude | * | JSPの先頭にインクルードするファイルを指定。 |
include-coda | * | JSPの末尾にインクルードするファイルを指定。 |
deferred-syntax-allowed-as-literal | ? | 文字シーケンス #{} を文字列リテラルとして使用してよいかどうか。デフォルトはfalse。 |
trim-directive-whitespaces | ? | ディレクティブが宣言された行は空白行として出力されるが、その空白行を削除するかどうか。デフォルトはfalse。 |
- ディレクティブで指定されている場合、そちらが優先される。