Section6: JavaServer Pages(JSP)テクノロジーモデル

JSPのライフサイクル
JSPにクライアントからの初回リクエストが到着してからの処理シーケンスを答えよ。
シーケンス
サーブレットコンテナにより、JSPファイルがサーブレットのJavaファイルへ変換される
サーブレットコンテナにより、サーブレットのJavaファイルがコンパイルされる
サーブレットコンテナにより、サーブレットがインスタンス化される。
サーブレットの初期化メソッド(jspInit())が呼ばれる
_jspServiceメソッドが呼ばれる。以後、リクエストがあるたびに_jspServiceメソッドが呼ばれる。
サーブレットの破棄メソッド(jspDestroy())が呼ばれる。
  • Tomcat5.5以降ではJavaのコンパイラが内蔵されているため、JREでTomcatを動かしていてもJSPは問題なくコンパイルできる。
JSPから変換されるサーブレットの継承関係
javax.servlet.Servlet[interface] ←(継承)- javax.servlet.jsp.JspPage[interface] ←(継承)- javax.servlet.jsp.HttpJspPage[interface]
JspPageのAPI
シグネチャ説明
public void jspInit()JSPページの初期化時に呼ばれる。このメソッドをオーバーライドする場合は、JSPに宣言<%! ... %>を使ってメソッドを定義する。
public void jspDestroy()JSPページの破棄時に呼ばれる。このメソッドをオーバーライドする場合は、JSPに宣言<%! ... %>を使ってメソッドを定義する。
HttpJspPageのAPI
シグネチャ説明
public void _jspService(HttpServletRequest request, HttpServletResponse response)JSPへリクエストが来るたびに実行される。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で指定する。
pageディレクティブの属性
属性デフォルト値説明
importjava.lang.*, javax.servlet.*, javax.servlet.http.*, javax.servlet.jsp.*インポートするクラスの指定。カンマ区切りで複数記述可能。
sessiontrueセッションを有効にするかどうか。falseにすると暗黙オブジェクトのsessionが使用できなくなる。
contentTypetext/html; charset=8859_1レスポンスのContent-Typeヘッダに出力するMIMEタイプと文字エンコーディングを指定。
pageEncodingcontentTypeで指定されているcharsetこのJSPファイルの記述に使用されている文字エンコーディング。
errorPageなし例外が発生した場合に転送するエラーページのパス。"/"から始まる場合はコンテキストルートからの相対ぱす。"/"から始まらない場合は、このJSPファイルからの相対パス。
isErrorPagefalseこのJSPがエラーページであるかどうか。trueに設定すると、暗黙オブジェクトのexceptionが使用できるようになる。
autoFlushtrue自動的に出力バッファをフラッシュするかどうか。
buffer8KB出力に使用するバッファサイズをKBで指定。バッファリングさせない場合は、「none」を指定する。
languagejavaJSPページで使用する言語を指定します。JSP2.1時点ではjavaのみ使用可能。
infoなしJSPページの情報。ここで設定した情報はServlet#getServletInfo()で取得できる。
extendsサーバの実装依存JSPページが継承するクラスを指定。
isELIgnoredfalseEL式を無視するかどうか。
deferredSyntaxAllowedAsLiteralfalse遅延評価のEL式の記法 #{} をリテラル中でただの文字列とみなすかどうかをtrueまたはfalseで指定する。
trimDirectiveWhitespacesfalse通常ディレクティブ行は空行として出力されるが、この属性が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で確認)
includeディレクティブの属性
属性必須説明
fileインクルードするファイルのパス。"/"から始まる場合はコンテキストルートからの相対パス、"/"から始まらないときはJSPファイルからの相対パス。インクルードは静的に行われるため、サーブレットをincludeすることはできない。
taglibディレクティブの属性
属性必須説明
prefixタグの前につけるプレフィクス名。
uriTLDファイルの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から変換されたサーブレットのソースにこのコメントが出力された。
暗黙オブジェクト
名前説明
pageContextjavax.servlet.jsp.PageContextページコンテキストオブジェクト。
requestjavax.servlet.http.HttpServletRequestリクエストオブジェクト。
sessionjavax.servlet.http.HttpSessionセッションオブジェクト。pageディレクティブのsession属性がfalseの場合は使用不可。
applicationjavax.servlet.ServletContextサーブレットコンテキストオブジェクト。
responsejavax.servlet.http.HttpServletResponseレスポンスオブジェクト。
outjavax.servlet.jsp.JspWriter出力用のライター。
configjavax.servlet.ServletConfigサーブレットの設定。初期化パラメータの取得などに使用する。
pagejava.lang.ObjectJSPから変換されたサーブレット自身を表す。thisと同じ。
exceptionjava.lang.Throwable例外発生時にスローされた例外オブジェクト。例外が発生したときで、pageディレクティブのisErrorPage属性がtrueの場合のみ使用可能。
  • 暗黙オブジェクトは_jspService()メソッド内のローカル変数として定義される。
  • よって、宣言の中では暗黙オブジェクトは使用できない。(宣言はクラス定義直下に展開されるため、_jspService()メソッド内のローカル変数は使えない)
  • JSPに初期化パラメータを指定する場合はweb.xmlのservletタグにjsp-fileタグとinit-paramタグを設定する必要がある。
  • Tomcatなどで、JSPから変換されたサーブレットのソースを一度は見ておくべき。
jsp-property-groupタグ
タグ多重度説明
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。
  • ディレクティブで指定されている場合、そちらが優先される。
inserted by FC2 system