Section8 JSP(Java Server Pages)モデル

※このセクションは英語と日本語版で項目が違い、英語版をもとにしました。

8.1 以下のJSPページ内での開始タグと終了タグを記述

項目 タグ 説明
ディレクティブ
directive
<%@ 〜 %> JSPの変換コマンド
宣言
declaration
<%! 〜 %> フィールド、あるいはメソッドに変換される。
スクリプトレット
scriptlet
<% 〜 %> 処理を書く

expression
<%= 〜 %> 出力する式を書く

ディレクティブはpage、include、taglibの3種類があります。

宣言は変換されると、サーブレットのフィールド、メソッド扱いとなります。

スクリプトレットは普通にJavaコードを書く部分です。 Javaコードなので、;が必要です。

<% int a=1; %>

式は、JSPに出力する式を書きます。 ;は不要(書いてはいけない)です。

<%=a %>

宣言を使うことで、 サーブレットのフィールドやメソッドに相当するものをJSPに記述できます。 ただし、フィールドは、セッションやアプリケーションスコープのオブジェクトで代用可能。メソッドは他のクラスに書いた方がわかりやすいこともあり、 宣言はあまり使われません(JSPだけで書く場合には使うけど)。

8.2 JSPタグの正しい記述と目的

一般的によく使われる処理がJSPタグとして用意されています。 スクリプトレッドを使わず、JSPタグを使うことで、 きれいなコード(保守性の高い)を書くことができます。

また、JSPタグ(=JSPアクション)とJSPディレクティブは 名前は似ていますが、違うものなので注意しましょう。

JSPタグは実行時に処理が行われます。
JSPディレクティブはコンパイル時に処理が行われます。
<%--JSP(include)ディレクティブ--%>
<%@include file="/hoge.jsp" />

<%--JSPタグ--%>
<jsp:include page="/hoge.jsp" />

8.3 JSPタグの型と、同等のXMLベースのタグを確認する

ディレクティブの例

<jsp:directive.page contentType="text/html; charset=Shift_JIS" />

JSPアクションの例
通常の書き方と同じっぽい。

<jsp:include page="hoge.jsp"/>

宣言(declaration)の例

<jsp:declaration>int count = 0;</jsp:declaration>

式(expression)の例

<jsp:expression>count</jsp:expression>

スクリプトレットの例

<jsp:scriptlet>out.println(count);</jsp:scriptlet>

動作確認していません。

8.4 ページディレクティブとその値を確認

pageディレクティブに指定できる属性はいろいろあります。

<%@ page
[ language="java" ] [ extends="package.class" ]
[ import="{package.class | package.*} , ... " ]
[ session="true|false" ]
[ buffer="none| 8kb|sizekb" ] [ autoFlush="true|false" ]
[ isThreadSafe="true|false" ] [ info="text" ]
[ errorPage="relativeURL" ] [ isErrorPage="true| false" ]
[ contentType="{mimeType [ ; charset=characterSet ] |
text/html ; charset=ISO-8859-1}" ]
[ pageEncoding="{characterSet | ISO-8859-1}" ]
%>

重要なものは以下

JSPページへのJavaクラスのインポート

","で区切って複数のインポート文を指定することができます。
<%@page import="java.util.Date" %>
<%@page import="java.util.*" %>
<%@page import="java.util.Date, java.util.Vector" %>

ちなみに、","区切りでダラダラ書くときは、 インデントを揃えると見やすいです。

<%@ page import="com.muimi.Hoge,
          com.muimi.Foo,
          com.muimi.Bar,
          java.util.List"
%>

セッション内に存在するJSPページを宣言

<%@page session="true" %>
デフォルトがtrueなので、セッション属性を使わない場合だけ、 falseで指定する。

エラーページにJSPページの使用法を宣言

<%@page errorPage="error.jsp">
JSPページ内で例外が投げられた場合の遷移先のページを指定できます。

JSPページがエラーページであると宣言

<%@page isErrorPage="true">
遷移先のJSPで、この記述をする。 この宣言をすることで、暗黙のexceptionオブジェクトを利用できます。

8.5 以下にあげたJSPのライフサイクルの順序を並び替えと確認

  1. JSPからサーブレットのソースコードに変換
  2. サーブレットのクラスファイルへコンパイル
  3. コンテナによるクラスファイルのロード(最初1回だけ)
  4. サーブレットインスタンスの生成
  5. コンテナによるjspInit()メソッドの呼び出し(最初1回だけ)
  6. コンテナによる_jspService()メソッドの呼び出し
  7. コンテナによるjspDestroy()メソッドの呼び出し(コンテナ停止時1回だけ)
この順番でしょう。

8.6 下記の暗黙のオブジェクトの目的、機能、使用方法に関して正しい記述

オブジェクト スコープ 説明
request javax.servlet.ServletRequest
のサブクラス
Request リクエスト。
response javax.servlet.ServletResponse
のサブクラス
Page レスポンス。
out javax.servlet.jsp.JspWriter Page 出力ストリームに書き込むときのオブジェクト。
session javax.servlet.http.HttpSession Session セッションオブジェクト。
config javax.servlet.ServletConfig Page サーブレットコンフィグオブジェクト。
application javax.servlet.ServletContext Application サーブレットコンテキストオブジェクト。
page java.lang.Object Page 生成されたサーブレットのthis。
pageContext javax.servlet.jsp.PageContext Page このページ環境。通常サーブレットエンジンが使用。
exception java.lang.Throwable Page エラーページで利用される、例外オブジェクト。

8.7 スクリプトレットが正しいか正しくないか区別する

これはいろいろ例題をやってみるのがいいと思います。 いくつか例を示します。
<%= name; %>

結果:式に";"があるのでコンパイルエラー。

<% for(int i=0; i<10; i++) %>
<%= "item[i]" %>
<% } %>

結果:"item[i]"という文字列を10回分表示(""でかこってるから)

<%  int c=a+b; %>
<%= "c=" + c %>
<%! int a=1; %>
<%! int b=2; %>

結果:"c=3"を表示。