最終更新 2012/06/23
サーブレットテクノロジーモデル

JSP（JavaServer Pages）

HTTP

JSP 概要Web アプリケーション概要

JSP 構成要素

HTTP リクエスト インターフェース

JSP 暗黙オブジェクト

HTTP レスポンス インターフェース

JSP コンフィギュレーション

Cookie の利用
Web アプリケーションの構造と配備

式言語（EL）を使用した JSP の構築
EL(Expression Language)

Web アプリケーション構成ディレクトリ

検索順序と暗黙オブジェクトのアクセス

配備記述子（web.xml）

Functions 機能の利用

Web コンテナモデル

標準アクションを使用した JSP の構築

サーブレットのライフサイクル

標準アクションタグ

Web アプリケーションをサポートするオブジェクト

JavaBeans に対するアクションタグ

初期化パラメータ

タグライブラリを使用した JSP の構築

リクエストパラメータ処理（日本語処理）

タグライブラリ

他のサーブレットへの転送

JSTL（taglib の url 定義）

コンポーネント間のデータ共有

core ライブラリ

Web コンテナのイベント処理（リスナー）
フィルタリング
セッション管理

カスタムタグの作成
独自タグハンドラクラス（tld ファイル）カスタムタグ API

セッション管理概要

Tag インターフェース

URLRewriting

IterationTag インターフェース

forward と sendRedirect の違い

BodyTag インターフェース

Web アプリケーションのセキュリティ

タグの入れ子処理

情報セキュリティ

SimpleTag インターフェース

Java EE 認証機能（Tomcat での例）

タグファイル

セキュリティ情報の取得

JavaEE デザインパターン
JavaEE デザインパターンとはMVC（Model View Controller）
Intercepting Filter
Front Controller
Business Delegate
Service Locator
Transfer Object

Authoring Documents by kita

■サーブレットテクノロジーモデル
HTTP
HTTP リクエスト構造
GET /index.html HTTP/1.1‥‥要求行（リクエストライン）
User-Agent: Mozilla5.0（Windows～） ‥‥ヘッダー～～～略‥‥空白（ヘッダーとボディを判断する）
name=mai‥‥ボディ（POST の場合のみ埋め込まれる。GET の場合は URL に付与）

HTTP リクエストのメソッド
メソッド

説明

GET

ページの情報を取得。パラメータは URL に埋め込まれる為、文字数制限がある（例）index.html?name=mai&age=16

POST

ページの情報を取得。パラメータは BODY に埋め込み

HEAD

URL で指定されたファイルのメッセージヘッダーのみ取得する

PUT

ファイルの更新、作成

DELETE

URL で指定したファイルをサーバーから削除

TRACE

HTTP の動作をトレースする

OPTIONS

サポートされている通信オプションを確認する

CONNECT

プロキシにトンネリングを要求する際に使用

HTTP リクエストヘッダー
リクエストやレスポンスの両方で使用できるものや、リクエストのみで利用できるものがある
リクエストヘッダーは[ヘッダー名:値,値‥‥]の形式で主にクライアントに関する情報が含まれる
ヘッダー

説明

Host

リクエスト先のサーバー

User-Agent

クライアントのブラウザやバージョン

Acceptクライアントのブラウザが受信可能なデータ形式

Accept-Language

クライアントのブラウザが優先する言語

Content-Length

POST リクエストのデータサイズ

Connection

クライアントが持続性のある HTTP 接続を行えるか否か

HTTP レスポンス構造
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1～～～略‥‥応答行（ステータスライン）‥‥ヘッダー<html><body>テスト</body></html>‥‥空白（ヘッダーとボディを判断する）
‥‥ボディ

ｽﾃｰﾀｽ

ﾘｰｽﾞﾝﾌﾚｰｽﾞ

説明

200

OK

サーバーからの応答が正常

401

Unauthorized

パスワード保護されたページに正しい情報なしでアクセスした403

Forbidden

サーバーからのリソース提供を拒否

404

Not Found

指定したアドレスにリソースがない

500

Internal Server Error

不特定のサーバーエラー

HTTP レスポンスヘッダー[ヘッダー名:値,値‥‥]の形式で主にサーバーに関する情報やレスポンスに関する情報が含まれる
ヘッダー名

説明

Date

レスポンスが作成された日付/時刻

Server

WebServer の名称やバージョンを示す

Content-Language

レスポンスの言語。en(英語)や jp(日本語)で示す

Content-Length

レスポンスのデータサイズ(byte)

Content-Type

レスポンスの MIME タイプ（例）Content-Type: text/html なら HTML として解釈される

MIME タイプ

説明

text/plain

プレーンテキストファイル

text/html

HTML テキストファイル

application/pdf

PDF ファイル

image/jpeg

JPEG イメージファイル

video/mpeg

MPEG ビデオクリップファイル

Web アプリケーション概要
Web アプリケーション
クライアントが動的コンテンツを要求した場合、その要求を実行可能な環境に転送し、その実行環境が適切なプログラムを起動しコンテンツを生成する。その環境で動作するプログラムのことを Web アプリケーションと呼ぶ

JavaEE と実行環境
Web アプリケーションの実行環境を Web コンテナと呼ぶ
エディション説明
サーバーサイドアプリケーションを実現する大規模なシステム向けの Enterprise Edition

Java EE

JavaEE 単独インストールは出来ない為、JavaSE をインストールしておく必要がある
サーブレット、JSP、JSTL などのテクノロジーを実装

Java SEJVM、JDBC などのテクノロジーを実装、標準 API、デスクトップ環境を含む Standard Edition

Java ME

モバイル、組み込み API を含む Micro Edition

テクノロジー説明

サーブレットHTTP からのリクエストを元に動的コンテンツの生成。役割はアプリケーション全体の制御

JSP

HTML 内に Java コードを埋め込み動的コンテンツの生成。役割は表示部分を行う

JSTL

JSP で繰り返し出てくる処理をタグとしてライブラリ化したもの

サーブレットの作成と実行
任意のフォルダ
コンテキストルート（各アプリケーションのトップディレクトリとして作成する）│ index.html
HTML や JSP などを配置する│
コンテキストルート直下に必ず作成する必要がある└─ WEBWEB-INF│ web.xml
サーブレットと URL の紐付けや、その他の各種設定を行うファイル│
クラスファイルを配置├─ classes│
クラスファイルをアーカイブ化（JAR）したファイルを配置└─ libTomcat を使用する場合、コンテキストルートは、$CATALINA_HOME/webapps/

以下に配置する

また全てのアプリケーションに共通する設定ファイルは$CATALINA_HOME/conf/web.xml で定義する

サーブレットの構造
import java.io.*;import javax.servlet.*;import javax.servlet.http.*;①必要なパッケージのインポート

public class HelloWorld extends HttpServlet{
public void doGet (HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {// リクエスト受信時に行いたい処理を記述}}②HttpServlet を継承したクラス宣言③HTTP 用メソッドのオーバーライド② HttpServlet を継承したクラス宣言
HttpServlet クラスには Web コンテナで動作するために必要な定義が組み込まれている。継承関係は以下の通り
java.lang Object ← javax.servlet GenericServlet←

javax.servlet.http HttpServlet ← XXX 独自のｻｰﾌﾞﾚｯﾄｸﾗｽ③ HTTP 用メソッドのオーバーライド
HttpServlet クラスには HTTP リクエストを処理する為に doGet()メソッドや、doPost()
doPost()メソッドが定義されている
doGet()
doPost()
これらのメソッドをオーバーライドすることでリクエストに応じた処理を実装することが可能
Web コンテナでは GET/POST の何れのリクエストであってもサーブレットに対しては service()メソッドを呼び出す
service()
作成したサーブレットクラスに service()メソッドを実装しない場合、スーパークラス（HttpServlet）の service()が呼び出され、その中で GET なら doGet()、POST なら doPost()を呼び出す
開発者が作成したクラス内で doGet/Post()メソッドをオーバーライドさせることで任意の処理を実装させる

HttpServletRequest オブジェクト
HTTP リクエストに関する情報や、クライアントに関する情報を保持
HttpServletResponse オブジェクト
HTTP レスポンスに関する情報を保持。作成するサーブレットでは直接 HTTP レスポンスを作成するのではなく、
HttpServletResponse オブジェクトに対して出力結果を書き出す
継承関係は以下の通り

Javax.servlet<Interface>ServletRequest<Interface>ServletResponse↑↑
Javax.servlet.http <Interface>HttpServletRequest <Interface>HTTPServletResponse
↑
↑
実装クラス
実装クラス

HTTP リクエスト インターフェース
HTTP ﾘｸｴｽﾄﾍｯﾀﾞｰに様々な情報が格納されており、サーブレットでは、これらの情報は HttpServletRequest ｵﾌﾞｼﾞｪｸﾄに格納されている。よって HttpServletRequest ｲﾝﾀｰﾌｪｰｽ、ServletRequest ｲﾝﾀｰﾌｪｰｽを使用し HTTP リクエストの情報を取り出せる

ServletRequest
ServletRequest

インターフェースの主なメソッド

メソッド

説明（リクエストに格納されている情報内容）

int getContentLength()

ボディ或いは入力ストリームから読み取れるバイト数

String getContentType()

メッセージボディの MIME タイプ

ServletInputStream getInputStream()

ボディに含まれるバイナリを読み込むための ServletInputStream を取得

BufferedReader getReader()ボディに含まれるデータを読み込むための BufferedReader を取得

String getRemoteAddr()

クライアントまたは最後のプロキシの送信元 IP アドレス

String getRemoteHost()

クライアントまたは最後のプロキシの送信元ドメイン名

int getRemotePort()

クライアントまたは最後のプロキシの送信元ポート番号

Locale getLocale()

クライアントのロケールを Accept-Language ヘッダに基づいて返す

String getServerName()

要求を受信したサーバーホスト名

int getServerPort()

要求を受信したサーバーのポート番号

HttpServletReques
HttpServletRequest
Requestインターフェースの主なメソッド

メソッド

説明（リクエストに格納されている情報内容）

Cookie[] getCookies()

クライアントから送られてきた全ての Cookie オブジェクトの配列を返す

String getHeader(String name)

指定したリクエストヘッダーの値を String として返す

Enumeration getHeaders(String name)

指定したリクエストヘッダーの全ての値を Enumeration として返す

Enumeration getHeaderNames()

リクエストに含まれる全てのヘッダー名を Enumeration として返す

int getIntHeader(String name)

指定したリクエストヘッダーの値を int として返す
戻り値が int 型でない場合、実行時エラーとなる

メソッド

説明（例を元に取得する値）

StringBuffer getRequestURI()

ﾘｸｴｽﾄされた URL を返す（http://localhost:8080/controot/login/test）

String getContextPath()

ﾘｸｴｽﾄされた URL の内、コンテキスト部分のみ返す（/controot）

String getServletPath()

ﾘｸｴｽﾄされた URL の内、サーブレットを呼び出す部分のみ返す（/login）

String getPathInfo()

ﾘｸｴｽﾄされた URL の内、ｸﾗｲｱﾝﾄが URL に付与したﾊﾟｽを返す（/test）（例）<url-pattern>/login/*</url-pattern>

において、http://localhost:8080/controot/login/testにアクセスHTTP レスポンス インターフェース
Web コンテナから提供される HttpServletResponse ｵﾌﾞｼﾞｪｸﾄに結果情報を書き出すことでクライアントにHTTP レスポンスを送信する。その際に HTTPServletResponse ｲﾝﾀｰﾌｪｰｽ、ServletResponse ｲﾝﾀｰﾌｪｰｽを使用する

ServletRe
ServletResponse
Response

インターフェースの主なメソッド

メソッド

説明

void setContentType(String type)Content-Type ヘッダーに指定した値をセットする

void setContentLength(int len)Content-Length ヘッダーに指定した値をセットする

ServletOutputStream getOutputStream()

ﾊﾞｲﾅﾘﾃﾞｰﾀを出力際に使用する ServletOutputStream ｵﾌﾞｼﾞｪｸﾄを取得する

PrintWriter getWriter()

文字データを出力する際に使用する PrintWriter ｵﾌﾞｼﾞｪｸﾄを取得する

void flushBuffer()

バッファ内のレスポンスを書き出しメソッドを終了させる（通常はメソッド終了時に書き出す）（例）ボディに文字列を埋め込みクライアントに返す
public class HelloWorld extends HttpServlet{
public void doGet (HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter()out.println("<HTML>");
out.println("<BODY>");}}

HttpServletRe
HttpServletRespons
Response
sponsegetWriter()を使用し PrintWriter ｵﾌﾞｼﾞｪｸﾄを取得
このストリームに対して HTML タグを書き込んでいる
doGet メソッドの処理が終わると制御は Web コンテナに戻り HttpServletResponse ｵﾌﾞｼﾞｪｸﾄに書き込まれたHTML が HTTP レスポンスとしてクライアントに送信される

インターフェースの主なメソッド

メソッド

説明

void addCookie(Cookie cookie)

指定された Cookie をレスポンスに追加する

void setStatus(int sc [ ,String sm ])HTTP ステータスコードを設定する

void sendError(int sc [ ,String sm ])クライアントに指定した HTTP ステータスコードを返す

void addHeader(String name, String value)

指定した名前で指定した値を持つレスポンスヘッダーを追加する

void addIntHeader(String name, int value)

複数の値を持つレスポンスヘッダーが設定可能

void addDateHeader(String name, long date)void setHeader(String name, String value)

指定した名前で指定した値を持つレスポンスヘッダーを設定する

void setIntHeader(String name, int value)

既存の名前の場合は設定を上書きする

void setDateHeader(String name, long date)

Cookie の利用
サーブレット内で独自の Cookie を作成し、クライアントに送りたい場合、
javax.servlet.http パッケージに含まれる Cookie クラスを利用する

Cookieクラスの主なメソッド

メソッド

説明

void setSecure(boolean flag)true を設定することで、HTTPS や SSL のようなセキュアなプロトコルを使用している場合のみ Cookie を使用するようにブラウザに指示する

void setMaxAge(int expiry)

Cookie の最長存続時間を秒単位で指定する

String getName()

Cookie の名前を返す

String getValue()

Cookie の値を返す（例）Cookie オブジェクトの作成例
Cookie ck = new Cookie(name, value);

Cookie ｵﾌﾞｼﾞｪｸﾄの作成、Cookie 名と、Cookie 内に書き込まれる値を指定

response.addCookie(ck);

作成した Cookie ｵﾌﾞｼﾞｪｸﾄをレスポンスヘッダーに挿入する（例）Cookie オブジェクトの取得例
Cookie[] ck = request.getCookies();

クライアントから送られた Cookie をサーブレット内で取り出す

for (Cookie c: ck ) { c.getValue(); }クッキーの値を全て取得する■Web アプリケーションの構造と配備
Web アプリケーション構成ディレクトリWEBコンテキストルート直下に必ず作成する必要がある（クライアントが直接アクセスすることは出来ない）
WEB-INF│ web.xml
サーブレットと URL の紐付けや、その他の各種設定を行うファイル│ *.tld
カスタムタグを使用する際に必要となる設定ファイル│
クラスファイルを配置├─ classes│││└ com/se/Test.class パッケージ化したｸﾗｽﾌｧｲﾙ（com.se.Test.class）はパッケージ階層のディレクトリ作成する│
クラスファイルをアーカイブ化（JAR や ZIP）したファイルを配置├─ lib│└─ tags
カスタムタグに関連するタグファイル（*.tag、*.tagx）を格納
JAR ファイル内では、/META-INF/tags/*.tag *.tagx として格納
WAR ファイル
1 つの Web アプリケーション（ディレクトリ構造）を WAR ファイルと呼ばれる圧縮パッケージにし、Web コンテナに配備することで Web コンテナによって展開され Web アプリケーションとして実行することが可能
jar コマンドで圧縮時、マニフェストファイルを指定しない場合、/META-INF ディレクトリ以下にデフォルトの
MANIFEST.MF が作成される。デフォルトの MANIFEST.MF には jar コマンドのバージョンなどが記述されている
アプリケーション内で使用するライブラリの依存関係を定義することも可能

JAR ファイル
一般的なクラス群やライブラリ、JDBC ドライバ等を対象にした圧縮パッケージ

配備記述子（web.xml
配備記述子（web.xml）
web.xml）
コンテキスト毎に WEB-INF 配下に設置し、ルートタグ<web-app>～</web-app>の中に記述する。小文字大文字は区別される

分散環境の設定
クラスタリング(分散化)されたサーブレットコンテナ上で 問題無く実行されることを宣言<distributable />サーブレットの登録（例）http://<ホスト名[:ポート番号]>/<コンテキストルート>/login/にアクセスした際に、com.alo.Login.class が実行される場合の記述例

<servlet><servlet-name>Login</servlet-name><servlet-class>com.alo.Login</servlet-class>または<jsp-fles>/index.jsp</jsp-fles><load-on-startup>3</load-on-startup></servlet><servlet-mapping><servlet-name>Login</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>

任意の名前を付与する
url-pattern にマッチした時、実行されるクラスファイル
または ｺﾝﾃｷｽﾄﾙｰﾄ以下からの JSP ﾌｧｲﾙﾊﾟｽを指定
Web コンテナ起動時にサーブレットをインスタンス化する
場合に指定。数値はインスタンス化する順番<servlet>タグの<servlet-name>を指定する
マッチングする URL パターン

URL パターンの記載方法

説明/ から始まる/login の場合、/login/ や、/login などにマッチ/ から始まり、* で終わる

/login/* の場合、/login/abc*.拡張子*.do の場合、URL の末尾が.do の場合にマッチ

や、/login/abc/test/ にマッチ。拡張子の指定は不可

url-pattern に *.do と /login/ の 2 つがある場合、/login/test.do の URL は、
先頭からパターンマッチするため、/login/のパターンが先に出現し一致する。/login/でマップされたクラスが実行される

サーブレットの起動設定
サーブレットは Java クラスとは異なり、new キーワードでインスタンス化することが出来ない目的のサーブレットが初回リクエストされた時に Web コンテナによってインスタンス化される
web.xml で<load-on-startup>を指定することで Web コンテナ起動時にインスタンス化させることが可能

ウェルカムページの設定
URL 末尾のファイル名を省略した際に自動的に該当ディレクトリから検索されるファイルを指定する<welcome-file-list><wilecome-file>ファイル名 1</wilecome-file><wilecome-file>ファイル名 2</wilecome-file>・・・</welcome-file-list>

http://localhost/hello/ と指定した場合、最初にｻｰﾌﾞﾚｯﾄ URL ﾏｯﾋﾟﾝｸﾞを検索し、存在しなければ
http://localhost/hello/ファイル名 1 の表示を試みる
ファイル名 1 も存在しない場合は、
http://localhost/hello/ファイル名 2 の表示を試みる

エラーページの設定<error-page><error-code>HTTP ｽﾃｰﾀｽｺｰﾄﾞ</error-code><location>/ファイル名</location></error-page>

HTTP ステータスコードによって、指定したファイルを表示させる<error-page><exception-type>例外クラス名</exception-type><location>/ファイル名</location></error-page>

Java の例外クラスがスローされた場合に、指定したファイルを表示する

HttpServletResponse の sendError(HTTP ｽﾃｰﾀｽコード) メソッドで、クライアントに任意のエラーコードを返すことが可能
移動先のページでリクエストスコープの属性を取り出しエラー内容を取得することが可能
ステータスコード<%= request.getAttribute("javax.servlet.error.status_code") %>エラーメッセージ<%= request.getAttribute("javax.servlet.error.message") %>スローされた例外<%= request.getAttribute("javax.servlet.error.exception_type") %>MIME タイプの設定<mime-mapping><extention>拡張子(.は記述しない)</extention><mime-type>MIME タイプ</mime-type></mime-mapping>

特定の拡張子に対して、MIME タイプを定義する
image/jpeg
application/pdfなど（レスポンス時に Content-Type ヘッダー設定する）

セッションタイムアウト設定
セッションタイムアウトの時間を定義する
単位は分
0 または -1 でタイムアウトなし<session-config><session-timeout>タイムアウト時間（分）</session-timeout></session-config>

環境リソース（JNDI
環境リソース（JNDI）
JNDI）
JNDI（Java Naming and Directory Interface）リソースとして JDBC を設定することにより、Java アプリからは JNDI リソースを指定することで JDBC を利用することが出来る（例）tomcat の server.xml で以下のように定義していた場合の設定<Resource name="MySQL_JDBC" auth="Container" type="javax.sql.DataSource"/><resource-ref><res-ref-name>MySQL_JDBC</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>

外部リソースへの参照を定義
リソースの参照名
リソースの型のクラス名
リソースの制御方法
・Java アプリが接続する場合は「Application」
・Tomcat コンテナが接続する場合は「Container」<resource-env-ref><resource-env-ref-name>jms/Test</resource-env-ref-name><resource-env-type>javax.jms.Queue</resource-env-type></resource-env-ref>リソース環境への参照を定義
リソースの参照名
リソースの型のクラス名<env-entry><env-entry-name>test/string</env-entry-name><env-entry-value>Hello World</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry>

環境エントリへの参照を定義
環境エントリ名
環境エントリの値
環境エントリのデータ型(完全修飾子)（例）環境エントリに登録した値を取得する
InitialContext ctx = new InitialContext();
String value = (String)ctx.lookup("java:comp/env/環境エントリ名");

EJB コンポーネントの参照設定
サーブレットから EJB コンポーネントを使用するには<ejb-ref>または<ejb-local-ref>を使用する
タグ

説明

備考

<ejb-ref>利用する側が Enterprise Bean の利用する側と、Enterprise Bean がﾘﾓｰﾄｲﾝﾀｰﾌｪｰｽを使用してｱｸｾｽする場合異なる JVM でも利用可能

利用する側が Enterprise Bean の利用する側と、Enterprise Bean がﾛｰｶﾙｲﾝﾀｰﾌｪｰｽを使用してｱｸｾｽする場合同じ JVM でなければ利用できない<ejb-local-ref>■Web コンテナモデル
サーブレットのライフサイクル① ①’クライアントから HTTP リクエストをが送信される②

呼び出されたサーブレットが初回リクエストの場合、Web コンテナがサーブレットのクラスファイルをロードする③

Web コンテナがロードしたサーブレットクラスをインスタンス化する（以降 Web コンテナに常駐する）④

Web コンテナが service()メソッド（doPost()、doGet()）を呼び出す⑤ ⑤’クライアントに実行結果が返る※ 2 回目以降のリクエストは、① → ①’→ ④ → ⑤’→ ⑤ の流れになる

サーブレットのライフサイクルメソッド
メソッド

説明

public void init(ServletConfig config)

サーブレットがインスタンス化された時のみ実行される

public void init()

インスタンス化された後(2 回目以降のリクエスト)は実行されない引数を取らない init は引数を取る init の最後でコールされるため、開発者が初期化処理を組み込みたい場合、init()をオーバーライドすれば良い

service()doGet()

doPost()サーブレットに HTTP リクエストがある度に実行される
サーブレットに service()がオーバーライドされている場合は、
doGet() doPost()メソッドはコールされない

public void destroy()

サーブレットのオブジェクトが破棄される時のみ実行される
一般的に Web コンテナがシャットダウンする直前に呼ばれるWeb アプリケーションをサポートするオブジェクト
インターフェース名

説明

ServletContext

Web アプリケーション全体で利用できる情報を保持。コンテキスト毎に作成されるServletConfig

個々のサーブレット固有の情報を保持。サーブレット毎に作成される

HttpServletRequest

リクエスト情報を保持

HttpServletResponse

レスポンス情報を保持

HttpSession

セッション情報を保持

ServletContext と ServletConfig の取得メソッド
メソッド名

説明

public ServletContext getServletContext()

ServletContext を取得する

public ServletConfig getServletConfig()

ServletConfig を取得する

これらのメソッドは javax.servlet.GenericServlet クラスで提供され GenericServlet は HttpServlet のスーパークラス

初期化パラメータ
DB 名やホスト名などハードコーディングしたくないパラメータについて、web.xml 内に定義することが可能
Web アプリケーション内で共有するコンテキスト初期化パラメータ（ServletContext）と、サーブレット毎に設定するサーブレット初期化パラメータ（ServletConfig）の 2 種類がある
コンテキスト初期化パラメータ

サーブレット初期化パラメータ<context-param><param-name>パラメータ名</param-name><param-value>値</param-value></context-param><servlet><init-param><param-name>パラメータ名</param-name><param-value>値</param-value></init-param></servlet>

初期化パラメータの取得
コンテキスト初期化パラメータならば、ServletContext、サーブレット初期化パラメータならば、ServletConfigのオブジェクトを取得したのち、getInitParameter(String name)メソッドで値を取得する
これらの値をサーブレットなどで上書き設定することは出来ない<context-param><param-name>host</param-name><param-value>example.com</param-value></context-param>

ServletContext

ServletContext context = getServletContext();
String host = context.getInitParameter("host");※host には、example.com の値が格納される

インターフェースメソッド

メソッド名

説明

String getInitParameter(String name)

コンテキスト初期化パラメータ取得

Enumeration getInitParameterNames()

コンテキスト初期化パラメータ名を全て取得

int getMajorVersion()

Web コンテナがサポートしているサーブレットの API のメジャーバージョン

String getRealPath(String path)

指定した仮想パスに対応するファイルシステム上の絶対パスを返す

String getServletInfo()

サーブレットが動作しているコンテナや名前やバージョンを返す

URL getResource(String path)

指定したｱﾌﾟﾘｹｰｼｮﾝﾙｰﾄからの相対ﾊﾟｽのﾘｿｰｽﾌｧｲﾙから､URL ｵﾌﾞｼﾞｪｸﾄを取得(例) 絶対パスと、URL リソースを取得する
ServletContext context = getServletContext();
int realpath = context.getRealPath("index.jsp");// C:\Documents and Settings\Administrator\My Documents\NetBeansProjects\WebApp\build\Web\index.jsp
java.net.URL url = getResource("index.jsp");// jndi:/localhost/WebApp/index.jsp

リクエストパラメータ処理
HTML などのフォームから入力されたデータはリクエストオブジェクト（HttpServletRequest）に格納されるServletRequest

インターフェース（リクエストパラメータの取り出しメソッド）

メソッド名

説明

String getParameter(String name)

引数で指定したパラメータの値を取得する

String[] getParameterValues(String name)

引数で指定したパラメータの全ての値を取得する

Enumeration getParameterNames()

リクエストパラメータの全ての名前を返す

Map getParameterMap()

パラメータと値のセットを MAP オブジェクトとして全て取得（例）Web フォームからの値取得
http://localhost:8080/Webapp/form.html<form method="POST" action="./form/">
名前：<input type="text" name="name"><br>
年齢：<input type="text" name="age"><br><input type="checkbox" name="checkvl" value="test1">test1<br><input type="checkbox" name="checkvl" value="test2">test2<br><input type="checkbox" name="checkvl" value="test3">test3<br><input type="submit" value="SEND"></form>http://localhost:8080/Webapp/form/←SEND ボタン押下時の移動先←テキスト入力←テキスト入力←チェックボックス←form.html の action に紐付いた URL へ移動する

public class Requestpage extends HttpServlet {public void doPost (HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();request.setCharacterEncoding("Shift_JIS");
response.setContentType("text/html; charset=Shift_JIS");
String name = request.getParameter("name");String age = request.getParameter("age");
String[] checkvl = request.getParameterValues("checkvl");if( checkvl != null) {for(Object o:checkvl) {out.println(o);}}}}←名前のテキスト入力した値を取得←年齢のテキスト入力した値を取得←ﾁｪｯｸﾎﾞｯｸｽをチェックした値（value=で指定されている値）を取得

日本語処理
request.setCharacterEncoding("Shift_JIS");
リクエストボディに含まれるデータの文字コードを指定のエンコードで処理を行う
サーブレットの仕様として送信された文字列は ISO-8859-1 として扱われ Unicode に変換される
ISO-8859-1 のまま変換した場合、文字列に日本語が含まれている場合は文字化けが発生する

response.setContentType("text/html; charset=Shift_JIS");
レスポンスに対してのコンテントタイプを指定している
無指定の場合、MIME=text/html で、文字エンコードが ISO-8859-1 になる

他のサーブレットへの転送
クライアントからのリクエストを受け取ったサーブレットが応答するのではなく、他のサーブレットや JSP が応答するように制御を移すことが可能（呼び出し元のサーブレットに処理は戻ってこない）
実際にはサーブレットが Web コンテナを経由して、Web コンテナが他のサーブレットを呼び出すことで実現している
Web コンテナに直接アクセスできない為、RequestDispatcher オブジェクトを利用し Web コンテナに転送を依頼する
RequestDispatcher オブジェクトを取得するには以下のメソッドを使用する

ServletRequest インターフェース
メソッド名

説明

RequestDispatcher getRequestDispatcher("ﾊﾟｽ")

自ｺﾝﾃｷｽﾄﾙｰﾄからの相対ﾊﾟｽ(/で始めると絶対ﾊﾟｽになる)(例) RequestDispatcher rd = request.getRequestDispatcher("test");ServletContext インターフェース
メソッド名

説明

RequestDispatcher getRequestDispatcher("/絶対ﾊﾟﾟｽ")

自ｺﾝﾃｷｽﾄﾙｰﾄからの絶対ﾊﾟｽ(/から始めないと例外をスロー)

RequestDispatcher getNamedDispatcher("ｻｰﾌﾞﾚｯﾄ名")

web.xml の<servlet-name>からパスを取得する(例) RequestDispatcher rd = getServletContext().getRequestDispatcher("test");RequestDispatcher インターフェース
メソッド名

説明

void forward(ServletRequest req, ServletResponse res)処理を転送する。処理は転送元には戻らない

void include(ServletRequest req, ServletResponse res)

転送先でプログラムを実行し、結果を転送元に取り込む※forward()後、同じメソッドで更に forward()すると IllegalStateException 例外が発生する（foward 先なら問題ない）

forward()メソッドを実行するとリクエストオブジェクトには以下の属性が追加される
メソッド名

説明

javax.servlet.forward.request_uri

forward が行われた場合の元のリクエスト URI

javax.servlet.forward.context_path

forward が行われた場合の元のコンテキストパス

javax.servlet.forward.servlet_path

forward が行われた場合の元のサーブレットパス

javax.servlet.forward.path_info

forward が行われた場合の元のパス情報
HTTP リクエストが追加のパス情報を含む場合のみ付与

javax.servlet.forward.query_string

forward が行われた場合の元のクエリー文字列
HTTP リクエストのリクエスト URI がクエリ文字列を含む場合のみ付与（例）フォワードの実装
http://localhost:8080/WebApp/forwardtest.html<from action="/WebApp/Dispatcher">

Dispatcher.java

Web フォームから実行すると、下記サーブレットへ画面遷移するフォームを用意

http://localhost:8080/WebApp/Dispatcher

public class Dispatcher extends HttpServlet {public void doPost ～ {request.setCharacterEncoding("Shift-JIS");// コンテキスト/WebApp からの相対パス/ForwardRec へ転送する
RequestDispatcher dp = request.getRequestDispatcher("/ForwardRec");
dp.forward(request, response);

ForwardRec.java

http://localhost:8080/WebApp/ForwardRecpublic class ForwardRec extends HttpServlet {public void doPost ～ {response.setContentType("text/html; charset=Shift_JIS");
PrintWriter out = response.getWriter();request.setCharacterEncoding("Shift-JIS");out.println((String)request.getAttribute("～.request_uri"));out.println((String)request.getAttribute("～.context_path"));

今回の例による属性値/WebApp/DispatchRec/WebAppout.println((String)request.getAttribute("～.servlet_path"));out.println((String)request.getAttribute("～.path_info"));out.println((String)request.getAttribute("～.query_string"));/DispatchRec
null
null

コンポーネント間のデータ共有
サーブレット A が計算した結果をサーブレット B に渡したい場合など、コンポーネント間で情報を共有したい場合
共有データの置き場として Web コンテナが提供するオブジェクトを使用する（4 種類）
情報格納ｵﾌﾞｼﾞｪｸﾄ

スコープ

保存方法

pageContext

page

1 ページ内でのみ保存。JSP でのみ使用可能

HttpServletRequest

requestリクエスト毎の情報保持。レスポンスを返すと消滅
リクエストの転送先サーブレットや JSP でも参照可能

HttpSession

session

レスポンスを返しても消滅せず、セッションタイムアウトか明示的に破棄されるまでクライアント毎に情報を保持。またクライアント毎に専用の領域が確保される為、他クライアントと混在することはない
HttpSession session = request.getSession()

ServletContext

application

全てのクライアントで共有され、Web サーバーを停止しない限り消滅しない
ServletContext application = getServletContext()

スコープへアクセスするメソッド（全スコープで使用可能）
メソッド名

説明

Object getAttribute(String name)name で指定したｵﾌﾞｼﾞｪｸﾄを返す。存在しなければ null を返す

void removeAttribute(String name)name で指定したｵﾌﾞｼﾞｪｸﾄを削除する

void setAttribute(String name, Object value)

name で指定した名前で value を格納する

Enumeration getAttributeNames()

スコープ内の全ての属性の名前を取得する

pageContext のみ、更にスコープ範囲を指定する以下の引数が使用可能（省略時は pageContext.PAGE_SCOPE）
pageContext.スコープで指定～

PAGE_SCOPE

REQUEST_SCOPESESSION_SCOPEAPPLICATION_SCOPE（例）スコープを利用したデータ共有（HttpServletRequest オブジェクト）
Sample1.java

Sample2.java

request.setAttribute("data", "TEST");～forward メソッドで、Sample2.java へ転送

String data = (String)request.getAttribute("data");// data には TEST の値が格納される// pageContext.getAttribute("date",pageContext. REQUEST_SCOPE)// pageContext.getRequest().getAttribute("date")// でも同じ結果になる

セッション間で共有したい場合は、オブジェクトを request ではなく、session にすれば良い
session.setAttribute("data", "TEST");

String data = (String)session.getAttribute("data");

Web コンテナのイベント処理
Web コンテナは特定のオブジェクトに対し、オブジェクトが作成されたり属性が取り出されたりすることを監視しており、その結果をイベントオブジェクトとして通知する。この処理を定義したオブジェクトをリスナーオブジェクトと言う監視対象となるオブジェクトは ServletContext、HttpServletRequest、HttpSession の 3 つweb.xml へリスナークラスを登録する

<listener><listener-class>リスナーを実装したクラス名</listener-class></listener>

ServletContext オブジェクトのイベント処理
ServletContextListener

インタフェース

Web アプリケーションが起動するときや破棄されるときに呼び出される
メソッド名

説明

void contextInitialized(ServletContextEvent sce)

Web アプリケーションが起動する時に呼び出される

void contextDestroyed(ServletContextEvent sce)

Web アプリケーションが終了する時に呼び出される

ServletContextAttribute
ServletContextAttributeListener
AttributeListener

インタフェース

application スコープを持つデータが追加・置換・削除されたときに呼び出される
メソッド名

説明

void attributeAdded(ServletContextAttributeEvent ev)

Application スコープの属性が追加された直後に実行

void attributeRemoved(ServletContextAttributeEvent ev)

Application スコープの属性が削除された直後に実行

void attributeReplaced(ServletContextAttributeEvent ev)

Application スコープの属性が置換された直後に実行

上記のリスナーインターフェースを実装(implements)したクラスを作成し各メソッドをオーバーライドすることで、
setAttribute()や、removeAttribute()メソッドが実行されることで、attributeAdded()メソッド等が実行される（例）リスナー処理のサンプル
public class ServletContextLSNR implements
ServletContextListener,ServletContextAttributeListener {public void contextInitialized(ServletContextEvent sce){// Web アプリケーションが起動された際の処理}
public void contextDestroyed(ServletContextEvent sce){// Web アプリケーションが破棄された際の処理}
public void attributeAdded(ServletContextAttributeEvent ev){// setAttribute(String name,Object value) が実行された時の処理}
public void attributeRemoved(ServletContextAttributeEvent ev){// void removeAttribute(String name) が実行された時の処理}
public void attributeReplaced(ServletContextAttributeEvent ev){// setAttribute(String name,Object value) が実行された時の処理}}

HttpServletRequest オブジェクトのイベント処理
ServletRequestListener インタフェース
メソッド名

説明

void requestInitialized(ServletRequestEvent sre)

リクエストが発生した際に呼び出される

void requestDestroyed(ServletRequestEvent sre)

リクエストが終了した際に呼び出される

ServletRequestAttribute
ServletRequestAttributeListener
AttributeListener インターフェース
メソッド名

説明

void attributeAdded(ServletRequestAttributeEvent ev)

Request スコープの属性が追加された直後に実行

void attributeRemoved(ServletRequestAttributeEvent ev)

Request スコープの属性が削除された直後に実行

void attributeReplaced(ServletRequestAttributeEvent ev)

Request スコープの属性が置換された直後に実行

HTTP
HTTP セッションイベント処理
HttpSessionListener

インタフェース

メソッド名

説明void sessionCreated(HttpSessionEvent se)

HttpSession オブジェクトが作成された直後に実行

void sessionDestroyed(HttpSessionEvent se)

HttpSession オブジェクトが破棄される直前に実行

HttpSessionAttributeListener

インターフェース

メソッド名

説明

void attributeAdded(HttpSessionBindingEvent event)

HttpSession オブジェクトに属性が追加された直後に実行

void attributeRemoved(HttpSessionBindingEvent event)

HttpSession オブジェクトの属性が削除された直後に実行

void attributeReplaced(HttpSessionBindingEvent event)

HttpSession オブジェクトに属性が置換された直後に実行

HttpSessionActivationListener
HttpSessionActivationListener

インターフェース

メソッド名

説明

void sessionWillPassivate(HttpSessionEvent se)

HttpSession オブジェクトが非活性化する直前に実行

void sessionDidActivate(HttpSessionEvent se)

HttpSession オブジェクトが活性化された直後に実行

非活性化とはクライアントから一定時間アクセスがない場合に、HttpSession オブジェクトをストレージに退避すること活性化とは、ストレージからメモリ上に展開すること

HttpSessionBindingListener

インターフェース

メソッド名

説明

void valueBound(HttpSessionBindingEvent event)

このｲﾝﾀｰﾌｪｰｽを含むｵﾌﾞｼﾞｪｸﾄが属性として
HttpSession ｵﾌﾞｼﾞｪｸﾄにｾｯﾄされる時に実行

void valueUnbound(HttpSessionBindingEvent event)

上記と同様で、削除される時に実行※HttpSessionActivationListener、HttpSessionBindingListener は HttpSession を監視することでWeb コンテナからメソッド呼び出しが可能なため、web.xml への登録が不要

各 Event クラスのメソッド
メソッド名

説明

ServletContext getServletContext()

対象の ServletContext を返す

ServletRequest getServletRequest()

対象の ServletRequest を返す

HttpSession getSession()

対象の HttpSession を返す

String getName()

追加、置換、削除のあったデータの名前を返す

Object getValue()

追加、置換、削除のあったデータの値を返す

フィルタリング
web.xml で定義されたパターンにマッチしたリクエストに対し、独自の処理を実装させることが可能
関連付けられたサーブレットへのリクエストが来る前にサービスが起動されている必要がある為、Web コンテナが起動時にインスタンス化される
クラス関係

Filterjavax.servlet

FilterConfig ｲﾝﾀｰﾌｪｰｽ←

Filter ｲﾝﾀｰﾌｪｰｽ→FileterChain ｲﾝﾀｰﾌｪｰｽ

インタフェース

メソッド名

説明void init(FilterConfig filterConfig)

フィルタに初めてアクセスがあった時に一度だけ呼び出される

void doFilter(ServletRequest request

フィルタ処理が行われるリクエストがある度に呼び出されるメソッド, ServletResponse response

このメソッドで実行したいフィルタ処理を行う, FilterChain chain)
void destroy()

FilterConfig

コンテナの終了などフィルタプログラムが破棄される際に呼び出される

インターフェース

メソッド名

説明

String getInitParameter(String name)

Filter の初期化パラメータを取得

FileterChain

インターフェース

メソッド名

説明

void doFilter(ServletRequest request

連続するフィルタがある（web.xml で条件が一致するフィルタが複数存在, ServletResponse response )する）場合は、次に一致する条件のフィルタを呼び出す
連続するフィルタがない場合（チェーンの最後のフィルタ）は、
元々要求されていたプログラムを呼び出す
これを書かないと呼び出し元のﾌﾟﾛｸﾞﾗﾑを実行せず処理が終了してしまう

web.xml の書式<servlet>タグより前に記載する必要がある<filter><filter-name>フィルタ名</filter-name><filter-class>フィルタクラス名</filter-class><init-param> // 初期化パラメータは省略可能<param-name>パラメータ名</param-name><param-value>値</param-value></init-param></filter><filter-mapping><filter-name>フィルタ名</filter-name><url-pattern>URL パターン</url-pattern> または<dispatcher>ディスパッチャの種類</dispatcher></filter-mapping><servlet-name>サーブレット名</servlet-name>

URL パターンが複数ヒットした場合、上から順番に処理される
URL パターンと、サーブレット名の両方が一致した場合は、URL パターンのフィルタが優先される

ディスパッチャの種類

説明REQUESTURL がリスエストされた際にフィルタを実行（デフォルト）

FORWARD

フォワードが行われた際にフィルタ実行

INCLUDE

インクロードが行われた際にフィルタ実行

ERROR

エラーページへ処理が移る際にフィルタ実行（例）フィルタのサンプル<servlet><servlet-name>Helloworld</servlet-name><servlet-class>Helloworld</servlet-class></servlet><servlet-mapping><servlet-name>Helloworld</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><filter><filter-name>AFilter</filter-name><filter-class>AFilterServlet</filter-class></filter><filter><filter-name>BFilter</filter-name><filter-class>BFilterServlet</filter-class></filter><filter-mapping><filter-name>AFilter</filter-name><servlet-name>Helloworld</servlet-name></filter-mapping><filter-mapping><filter-name>BFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>import java.io.*;import javax.servlet.*;public class BFilterServlet implements Filter{
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException{～B フィルタ事前処理～// chain.doFilter メソッドをコールすると、// 次に条件が一致する AFilter が実行される
chain.doFilter(request, response);// ↑を記述しないと最初にマッチした BFilter の// doFilter メソッドのみ実行して呼び出し元のメソッドに戻る～B フィルタ事後処理～}
public void init(FilterConfig filterConfig)
throws ServletException{ }public void destroy(){ }}※AFilterServlet クラスは割愛
http://localhost:8080/Webapp/hello/ でアクセスした場合、B フィルタ事前処理
A フィルタの処理
B フィルタ事後処理

chain.doFilter()コール前の処理
chain.doFilter()コール後の処理の順に実行される■セッション管理
セッション管理概要
セッション管理を実現する為に Web コンテナ上にセッションオブジェクトを保持する
セッションオブジェクトは javax.servlet.http.HTTPSession インターフェースを実装したオブジェクト
セッションオブジェクトは Web コンテナが生成・管理する為、インスタンス化する必要はない

HttpServletRequest

インターフェース

メソッド名

説明

HttpSession getSession([true|false])true ：現在のセッションオブジェクトを取得。セッションがなければ新規セッションを作成する（引数を省略した場合は true になる）
false：現在のセッションを返す。セッションがなければ null を返す

boolean isRequestedSessionIdValid()

リクエストの SID が有効であれば true

boolean isRequestedSessionIdFromCookie()

SID が Cookie から送られてくれば true

boolean isRequestedSessionIdFromURL()

Cookie が無効且つ、SID がリクエストの URL の一部の場合に true

（例）サーブレット間でのセッション取得
SessionServletAから SessionServletB に画面遷移した際に、A で取得した SID を B で取得している

public class SessionServletA extends HttpServlet {public void doGet(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException{// 既存セッション取得、なければ null を返す
HttpSession sid = request.getSession(false);
if (sid == null) {// 既存セッションがなければ新規セッション取得
sid = request.getSession(true);}
PrintWriter out = response.getWriter();out.println("<HTML><BODY>");out.println(sid.getId());// サーブレット B へのリンク
out.println("<A HREF=\"./SessionB\">Click</A>");out.println("</BODY></HTML>");}}

HttpSession

public class SessionServletB extends HttpServlet {public void doGet(HttpServletRequest request,
HttpServletResponse response)throws ServletException, IOException{// 既存セッションを取得する
HttpSession sid = request.getSession(false);
PrintWriter out = response.getWriter();// セッションがある場合のみ画面表示させる
if (sid != null) {out.println("<HTML><BODY>");// サーブレット A で取得した SID と同じ値
out.println(sid.getId());
out.println("</BODY></HTML>");} else {out.println("直接参照は禁止されています");}}}インターフェース

メソッド名

説明

long getCreationTime()

セッションが作成された時刻（ｴﾎﾟｯｸﾀｲﾑでﾐﾘ秒）SID なければ例外をスロー

String getId()

セッション ID を取得

long getLastAccessedTime()

クライアントが最後に送ったリクエスト時刻（ｴﾎﾟｯｸﾀｲﾑでﾐﾘ秒）

void setMaxInactiveInterval(int 秒)

クライアントが最後に送ったリクエストを受けてから、セッションが無効になるまでの最大秒数（引数をマイナスにすればブラウザ閉じるまでセッション有効）

int getMaxInactiveInterval()

Web コンテナ⇔クライアント間のセッションが切れるまでの有効期限（秒）void invalidate()

セッションを無効にし、結び付けられている全てのオブジェクトを無効にする

boolean isNew()

セッションを新規に取得したのか、既存のセッションを取得したのか判定する

URL Rewriting
HttpSession オブジェクトを使用したセッション管理はサーバー⇔クライアント間で Cookie を授受することで実現していたが、ブラウザによっては Cookie を無効にしている。URL Reriting は Cookie が無効な状況でのセッション管理を実現する
レスポンスとして出力される HTML に含まれるリンクなどの URL に必ずセッション ID を含めておく
セッション ID を URL にエンコードすることでセッション管理を実現する

HttpServletResponse

インターフェース

メソッド名

説明

String encodeURL(String URL)

引数で指定した URL にセッション ID を含める
Cookie 対応してる場合は、そのままの URL を返す

String encodeRedirectURL(String URL)

転送用に定義されている sendRedirect メソッドの引数に渡す場合に使用する
動作自体は encodeURL と全く同じ

void sendRedirect(String location)

location にﾘﾀﾞｲﾚｸﾄする。/から始めた場合は WEB の絶対パス指定になる

（例）URL Rewriting のサンプル
public class URLRewritingSample extends HttpServlet {public void doPost ～ {HttpSession sid = request.getSession(true);// セッション ID を付与した URL を作成する（Cookie 対応してる場合は、引数がそのまま返される）
String url = response.encodeURL("./hello");// http://localhost:8080/WebApp/URLSanple;jsessionid=7E94613A60D8C2868F7BE7D9224BA7F6// 赤文字の部分が付与される。このパラメータを引き継ぐことでセッション管理を実現する
out.println("<A href=\"" + url + "\">Click</A>");

forward と sendRedirect の違い
動作

説明

フォワード

クライアントからの要求をサーバー内で転送され、転送先のページをクライアントに返す
リクエストパラメータをページ間で共有できる。同じサーバー内でしか転送できない
URL はフォーワード前から変わらない

リダイレクトサーバーが指定したページにリダイレクトするようにクライアントへ指示し、クライアントは改めて該当ページへアクセスする（2 回リクエストが発生する）
URL がリダイレクト先のファイル名になる■Web アプリケーションのセキュリティ
情報セキュリティ
機密性

リソースに対して権限を持つユーザーだけがアクセス可能にする特性

完全性

データの正当性、正確性、網羅性、一貫性を維持すること。欠落や重複、改ざんが行われていないこと

可用性

情報が必要な時に、いつでも正常なサービスが提供できる状態を維持する

Java EE 認証機能（Tomcat）
認証機能
ロール

リソースに対する権限や役割。ユーザーに対してロールを付与することでリソースにアクセス可能になる
Web アプリケーションが認識するユーザーのデータベース

レルム
ユーザーとパスワードから、そのユーザーに付与されているロール一覧を取得する
server.xml でレルムを定義する（Tomcat ではデフォルトで UserDatabase が定義されている）

tomcattomcat-users.xml でユーザーとロールを紐付ける<tomcat-users><role rolename="role1"/><role rolename="role2"/><user username="tomcat" password="tomcat" roles="role1"/><user username="both"
password="tomcat" roles="role1,role2"/><user username="test"
password="tomcat" roles="role1"/>
password="tomcat" roles="manager,admin"/><user username="root"</tomcat-users>←Tomcat 管理ユーザー

web.xml でセキュリティ設定を行う
でセキュリティ設定を行う<security-role><role-name>ロール名</role-name></security-role>

使用するロール名を定義（tomcat-users.xml で定義されている必要がある）
複数指定する場合は<security-role>を複数定義する

<login-config><auth-method>認証方式</auth-method><realm-name>領域名（省略可）</realm-name><form-login-config><form-login-page>ﾛｸﾞｲﾝﾍﾟｰｼﾞ</form-login-page><form-error-page>ｴﾗｰﾍﾟｰｼﾞ</form-error-page></form-login-config></login-config>

認証方式を定義
BASIC ：ダイアログボックス表示（暗号化されない）←ダイアログに表示される領域名を定義する
DIGEST：ダイアログボックス表示（暗号化される）
FORM ：フォーム認証（暗号化されない）<form-login-config>タグの指定が必要
上記タグのファイルが認証用のページになる
CLIENT-CERT：SSL 暗号が前提でクライアントに証明書のインストールが必要<security-constraint><web-resource-collection><web-resource-name>ﾘｿｰｽ名</web-resource-name><url-pattern>URL ﾊﾟﾀｰﾝ</url-pattern><http-method>HTTP ﾒｿｯﾄﾞ(省略可)</http-method></web-resource-collection>

条件にマッチした場合に認証を要求する<auth-constraint><role-name>ロール名</role-name></auth-constraint>

任意のﾘｿｰｽ名を定義
ｺﾝﾃｷｽﾄﾙｰﾄからの URL ﾊﾟﾀｰﾝを定義 /* /auth/* など
認証させる HTTP ﾒｿｯﾄﾞを定義（複数定義は都度ﾀｸﾞ追加）
記載がないﾒｿｯﾄﾞは制限なくｱｸｾｽできる
省略時は全てのﾒｿｯﾄﾞが認証対象になる
この制限に割り当てるロール名を定義
複数割り当てる場合は、* 又は<role-name>を複数記述<user-data-constraint><transport-guarantee>保護ﾚﾍﾞﾙ</transport-guarantee></user-data-constraint></security-constraint>

クライアントとの通信方式を定義する
保護レベルは以下の中から選択する
NONE：セキュリティ要求なし（省略時のデフォルト）
INTEGRAL：データが改ざんされないことを要求
CONFIDENTIAL：盗聴されないことを要求<login<login-config>でconfig>で FORM を指定した場合の認証ページ<html><head><title>FORM 認証</title></head><body><form action="j_security_check" method="POST">USER<input type="text" name="j_username"><br>
PASS<input type="text" name="j_password"><br><br><input type="submit" value="OK"></form></body></html>

action、method 及び、ユーザー名とパスワードはそれぞれ固定の値（赤文字）にする必要がある

セキュリティ情報の取得
HttpServletRequest

インターフェースで提供されるセキュリティ関連のメソッド

メソッド名

説明

String getAuthType()

認証方式を返す

String getRemoteUser()

認証されているユーザーを返す

boolean isUserInRole(String role)

認証されているユーザーが指定したロールを持っているか

Principal getUserPrincipal()

認証されているユーザー名を含むプリシパルオブジェクトを返す（取得値の例）User username="test", roles="role1"

ロール名に別名を付与する

サーブレット内で、manager としているが、実際は RoleA を指す

web.xml<servlet>～～<security-role-ref><role-name>manager</role-name><role-link>RoleA</role-link></security-role-ref></servlet>← サーブレットのコード内で記述されているロール名← web.xml の<security-role>で定義されているロール名を指定<role-link>は複数定義することが可能<security-role><role-name>RoleA</role-name></security-role>
tomcat-users.xml<tomcat-users><role rolename="roleA" /><user username="tomcat" password="tomcat" roles="roleA" /></tomcat-users>（例）別名で定義されたロールに関連付けられたユーザーを取得する例
if(request.isUserInRole("manager")) {name = request.getRemoteUser();} else if(request.isUserInRole("other")) {name = "other";}manager（RoleA の別名）を持っていた場合に真tomcat というユーザーがアクセスしてた場合は、真になるので、name には"tomcat"の文字列が入る
tomcat ユーザー以外は、other と表示される■JSP（
JSP（JavaServer Pages）
Pages）JSP 概要HTML に Java プログラムを埋め込むことでサーバー側で動的な Web ページを生成する技術
ファイルの配置場所は、コンテキストルート内であれば良い
JSP の特徴

説明コンパイル不要

実行時に Web コンテナがコンパイルする為、javac コマンドよるコンパイルが不要

マッピング不要JSP は主に表示部分を担当する為、web.xml によるマッピングは不要

EL の利用EL（Expression Language）により煩雑だったデータの取り出しをシンプルに記述可能

カスタムタグの利用

アプリケーション固有の振る舞いをタグ化することが可能

JSP 実行プロセス① クライアントが JSP にアクセスする② Web コンテナが JSP ファイルを読み込む③ Web コンテナが JSP サーブレットのソースコードに変換する（tomcat では、$CATALINA_HOME/work 以下に作成する）④ Web コンテナがソースファイルをコンパイルし JSP サーブレットのクラスファイルを生成する

⑤ Web コンテナが JSP サーブレットをインスタンス化する⑥ Web コンテナが何かしろの処理を行う⑦ クライアントに実行結果が返る
一度インスタンス化されたものは Web コンテナ上に常駐する為、2 回目のアクセスは ①→⑥→⑦ になるインスタンス化された JSP のタイムスタンプより JSP が新しい場合は、再度コンパイル処理を実行する

JSP のライフサイクルメソッドのライフサイクルメソッド
メソッド名

説明

public void jspInit()

JSP サーブレットがインスタンス化された後に実行（JspPage ｲﾝﾀｰﾌｪｰｽにて実装）

public void _jspService()

JSP サーブレットに HTTP リクエストがある度に実行（HttpJspPage ｲﾝﾀｰﾌｪｰｽ）

public void jspDestroy()

JSP サーブレットのオブジェクトが破棄されるタイミングで実行 （JspPage ｲﾝﾀｰﾌｪｰｽ）（例）ライフサイクルメソッドの使用例<HTML><BODY><%! public void jspInit() {// インスタンス化された時のみ実行される}%></HTML></BODY>

JSP 構成要素
コメント<!-- コメント -->ソース表示で確認できるコメント<%-- コメント --%>

ソース表示しても確認できないコメント

ディレクティブタグ
JSP のページ全体に作用するような定義を行うタグ
page ディレクティブタグ【JSP 独自形式】<%@ page 属性="値" [属性="値"]... %>【XML 形式】<jsp:directive.page 属性="値" />主な属性

デフォルト値

説明

languagejava

JSP 内で使用できる言語（JSP2.1 では java のみ使用可能）

extends

使用ｺﾝﾃﾅ依存

継承するクラス名

importjava.lang.*

インポートするクラス名（コンパイル時にファイルを取り込む）

javax.servlet.*

複数指定する場合、スペース区切りで import 指定の他に以下の指定も可能

javax.servlet.jsp.*<%@ page import="java.util.HashSet,java.text.DateFormat" %>javax.servlet.http.*
sessiontrue

ｾｯｼｮﾝ管理に参加するか指定（false の場合、暗黙ｵﾌﾞｼﾞｪｸﾄの session が使用不可）

buffer

8kb 以上

レスポンスのバッファを指定（単位は kb）none でﾊﾞｯﾌｧﾘﾝｸﾞしない

autoFlash

true

HTTP レスポンスに対するストリームのバッファサイズに達した場合、自動でフラッシュしてレスポンスを返すか

isThreadSafe

true

JSP コードをスレッドセーフ（シングルスレッド）するか

isErrorPage

false

当 JSP をエラーページとして使用する
true にすることで暗黙オブジェクトの exception が使用可能になる

isELIgnored

ｺﾝﾃﾅ依存EL 式を無効にする（そのままの文字列で表示）tomcat6 のﾃﾞﾌｫﾙﾄは false

info

-

JSP の説明（ServletContext.getServletinfo メソッドで取得可能）

errorPage-

例外発生時に表示するページへのパス

contentType

text/html;

レスポンスの MIME タイプと文字エンコーディング

charset=ISO-8859-1
pageEncoding

contentType に依存

JSP の文字エンコーディング（無指定だと ContentType の charaset の値になる）

include ディレクティブタグ
JSP に他の JSP や HTML を埋め込む時に使用。<jsp:include page>と異なりｺﾝﾊﾟｲﾙ時に取り込まれｻｰﾌﾞﾚｯﾄは取り込めない【JSP 独自形式】<%@ include file="ファイルパス" %>【XML 形式】<jsp:directive.include file="ファイルパス" />taglib ディレクティブタグ
カスタムタグを利用する際に使用【JSP 独自形式】<%@ taglib prefix="プレフィックス" { uri="URI" | tagdir="タグファイルパス"【XML 形式】} %><jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:プレフィックス="URI" version="2.1"></jsp:root>

スクリプティング
JSP で Java プログラムを記述する際に使用（サーブレットの_jspService()メソッド内の処理として変換される）

スクリプトレット【JSP 独自形式】<% Java コード %>【XML 形式】<jsp:scriptlet> Java コード </jsp:scriptlet>

宣言
宣言の中では暗黙オブジェクトは使用できない。 <%! void func(){ out.println("test") } %> だとエラーになる【JSP 独自形式】<%! 変数宣言 or メソッド定義 %>【XML 形式】<jsp:declaration> 変数宣言 </jsp:declaration >変数宣言はスクリプトレットでも可能だが、有効範囲が異なる<%! int numA = 100; %><% int numB = 100; %>// 格納した値を表示させる<%= numA %><% out.println(numB); %>public class XXX {int numA = 100;
public void _jspService() {int numB = 100;}}式
結果が String 型になる Java 言語を記述（java コードにおける out.print(式)を簡略して記述できるようにしたもの）
式の内部コードは文字列として変換できるコードまたは文字列を返す処理を記述し、コードの末尾に;を付与しない【JSP 独自形式】<%= 式 %>【XML 形式】<jsp:expression> 式 </jsp:expression>

フォームからの値を表示する場合<%= request.getParameter("name") %>のように記述する

JSP 暗黙オブジェクト
JSP 内でいつでも利用することが可能なオブジェクト<%=session.getAttribute() %><%=request.getParameter() %> のように変数宣言せず目的のオブジェクトが使用可能

暗黙ｵﾌﾞｼﾞｪｸﾄ

型名

スコープ

requestjavax.servlet.HttpServletRequest のサブクラス

requestresponse

javax.servlet.HttpServletRespose のサブクラス

page

pageContext

javax.servlet.jsp.PageContext

page

sessionjavax.servlet.http.HttpSession

sessionapplication

javax.servlet.ServletContext

applicationout

javax.servlet.jsp.JspWriter

page

configjavax.servlet.ServletConfig

page

page

java.lang.Object

page

exception

java.lang.Throwable

page

pageContext
pageContext

クラスで使用可能な主なメソッド

メソッド
void forward(String name)

引数に指定された URL にﾘｸｴｽﾄを転送し処理は転送された URL に引き継がれる

void include(String name)

引数に指定された URL のリソースを実行し、処理結果を転送元に返す

JspWriter getOut()out オブジェクトを返す

Object getPage()

page オブジェクトを返す

ServletRequest getRequest()

request オブジェクトを返す

ServletResponse getResponse()

response オブジェクトを返す

HttpSession getSession()session オブジェクトを返す

ServletConfig getServletConfig()

ServletConfig オブジェクトを返す

ServletContext getServletContext()

ServletContext オブジェクトを返す

int getAttributesScope(String name)name で指定したｵﾌﾞｼﾞｪｸﾄのｽｺｰﾌﾟを取得(1:page ～ 4:Application)

Object findAttribute(String name)name で指定したｵﾌﾞｼﾞｪｸﾄを page request session application の順で探す

Object getAttribute(String name [,int scope])name で指定したｵﾌﾞｼﾞｪｸﾄを返す

Enumeration getAttributeNamesInScope(int scope)指定したｽｺｰﾌﾟに格納されたｵﾌﾞｼﾞｪｸﾄを全て返す

void removeAttribute(String name [,int scope])name で指定したｵﾌﾞｼﾞｪｸﾄを削除する

void setAttribute(String name,Object value [,int scope])name で指定した名前で value を格納する

JSP コンフィギュレーション<jsp-config>を web.xml（配備記述子）に追加することで、JSP で共通利用できる情報を定義することが可能<jsp-config>の子タグには、JSP 内で使用されるタグライブラリ情報の指定<taglib>(複数指定可能)と複数の JSP をグループ化して、それらのファイルに対して共通のプロパティを指定する<jsp-property-group>がある<taglib> の子タグ

説明

<taglib-uri>

タグライブラリを識別する任意の文字列を指定（JSP の taglib で使用）
web.xml <taglib-uri>任意の文字列<taglib-uri>と指定した場合

JSP ファイル内で <%@taglib uri="taglib-uri の値" %> と指定する<taglib-location>

Web アプリケーションのルートを基準にしたタグライブラリ記述子の相対ファイル名を指定

<jsp<jsp-propertyproperty-group>

説明（ ）は省略時のデフォルト<url-pattern>

プロパティを適用する URL パターン（このパターンに一致すれば共通プロパティを使用する）<el-ignored>

EL 式を無効（そのままの文字列で表示させる）にする（false）<scripting-invalid>

スクリプティング<% %> <%= %> <%! %>を禁止する（false）<page-encoding>

文字エンコーディングを指定<is-xml>

XML 形式での JSP タグに限定する（false）<include-prelude>

各ページのヘッダーとしてインクルードするファイルを指定<include-coda>

各ページのフッターとしてインクルードするファイルを指定<trim-directive-

ディレクティブが宣言された行は、空白行としてレスポンスに出力されるが、その空行を削除

whitespaces>

する場合は、true を指定する（デフォルトは false）<%@ %>は使用可能<deferred-syntax#{}を文字列とみなすように指定する（デフォルトは false）
allowed-as-literal>■式言語（EL■式言語（EL）を使用したEL）を使用した JSP の構築
EL(Expression Language)
演算式や評価式の結果を出力、特定スコープ内に格納されたオブジェクトやプロパティを出力、FORM データの出力を行う【書式】${ 式 }演算子(ｴｲﾘｱｽ)

説明

+

加算

*

乗算

${ 3 + 3 } → 6

演算子(ｴｲﾘｱｽ)

説明

-

減算

/

div

除算（10 / 0 でもエラーにならず Infinity
が返却される）0/10 は 0 になる

%

mod

乗余

==

eq

等しい

${ 3 == 3 }→ true

!=

ne

等しくない

<

lt

小さい

${ 2 < 3→ true

>

gt

大きい

<=

le

以下

>=

ge

以上

or

論理和

}

empty

null または空文字

&&

and

論理積

||

!

not

否定

a?b:c

a の場合は b、a 以外の場合は cboolean の true 以外は全て false と評価される

EL が利用可能な箇所
・JSP の HTML タグの中に直接指定
・JSP タグの属性値として定義<b>${ 式 }</B><jsp:setProperty ... value="${ 式 }" />・スクリプトレット<% %>、式<%= %>、宣言内<%! %>に記述するとエラーになる

検索順序と暗黙オブジェクトのアクセス
EL 式を使用して暗黙オブジェクトもしくはスコープに格納された値のみ参照することが可能
ｾｯｼｮﾝｽｺｰﾌﾟに emp というオブジェクトがあり、emp オブジェクトには id 属性があった場合${emp.id}と記述した場合は、以下の順序で検索する${sessionScope.emp.id}

EL 式暗黙オブジェクトであるか(yes)→

指定されたキーが存在するか↓(no)(yes)→(no)└────────→

値を返す
null を返す

以下のスコープ順序で検索し、何れも値がない場合は null（web 上では何も表示されない）を返す└

pageScope→requestScope→ sessionScope→

applicationScope（例）検索順序のサンプル<% int a = 100, b = 200, c = 300; %>${ a } ${ b } ${ c }<% request.setAttribute("a", a); %><% session.setAttribute("b", b); %><% application.setAttribute("c", c); %>${ a }${ b }${ c }

ローカル変数を定義、それぞれ 100,200,300 を代入
暗黙オブジェクト、スコープオブジェクトにない為、null を返す
request スコープに値を格納する
session スコープに値を格納する
application スコープに値を格納する
requestScope 内に a を見つけたので 100 の値を返す
sessionScope 内に b を見つけたので 200 の値を返す
applicationScope 内に c を見つけたので 300 の値を返す

EL 式暗黙オブジェクトの一覧
暗黙ｵﾌﾞｼﾞｪｸﾄ名

説明

pageContext

PageContext オブジェクトには、JSP 暗黙オブジェクトを取得する為のゲッターメソッドが定義されている為、このオブジェクトを使用して JSP の暗黙オブジェクトにアクセスできる【書式】${pageContext.JSP 暗黙ｵﾌﾞｼﾞｪｸﾄ.ﾒｿｯﾄﾞ}（例）${pageContext.request.requestURI}→

メソッドは、get を削除し、小文字から始まる<%= request.getRequestURI() %>と全く同じ引数を取るメソッド getAttribute("名前")等は EL 式では使用できない${pageContext.request.attribute("名前")} は実行時エラーが発生する${requestScope.名前} または <%= request.getAttribute("名前")> で取得する
param

リクエストパラメータのキーと単独の値を持つ String 形式のマップ
EL 式の場合 param.name

JSP の場合 request.getParameter("name");paramValues

リクエストパラメータのキーと複数の値を持つ String 配列のマップ

header

リクエストヘッダーとのキーと値のマップ

headerValues

リクエストヘッダーとのキーと複数の値を持つ String 配列のマップ

cookieクッキーのキーと値のマップ（例）${cookie["JSESSIONID"].value}※value を入れないと Cookie オブジェクトの参照が返されるだけになる

initParam

初期化パラメータのキーと値のマップ（web.xml の<context-param>タグで定義された値を格納）（例）フォームから取得した値を表示<form method="POST" action="./test.jsp">
ユーザー名：<input type="text" name="uid" value="uid"><br>chk1：<input type="checkbox" name="chk" value="chk1">
chk2：<input type="checkbox" name="chk" value="chk2"><input type="submit" value="SEND"></form>// JSP での取得、EL での取得ﾊﾟﾀｰﾝ 1 EL での取得ﾊﾟﾀｰﾝ 2<%= request.getParameter("uid") %> ${param.uid} ${param["uid"]}// checkbox など配列で格納されてる値の取得ﾊﾟﾀｰﾝ（ｲﾝﾃﾞｯｸｽは必ず[]括りの数値であること）// ｲﾝﾃﾞｯｸｽを""で囲った場合、自動的に数値に変換される（数値変換できない場合は例外をスロー）${paramValues.chk[0]} ${paramValues["chk"]["0"]}${paramValues.chk[1]} ${paramValues["chk"]["1"]}// ${paramValues.chk.1}のようにするとコンパイルエラーになる${a["b"]} と記述した時の EL の解釈は以下の通り
・a が Map オブジェクトの場合、b をキーとする値が含まれているか検索し、なければ Null を返す
・a が List または配列の場合、"b"を整数に変換する（変換できない場合は例外をスロー）
b をインデックスとして値を取得するが、インデックス溢れ例外の場合、例外をスローせず null を返す
それ以外の例外が発生した場合はエラーとなる（例）JavaBeans の getter メソッドを介して、HashMap の値を取得
public class EmpBean implements java.io.Serializable {private HashMap<String, String> map = new HashMap<String, String>();public void setName(String key,String name) {map.put(key,name);}public HashMap<String,String> getName() {return this.map;}}<jsp:useBean id="emp" class="EmpBean" /><% emp.setName("key1", "value"); %>${emp.name.key1} // value が表示される <%= emp.getName().get("key1") %>と全く同じ動作になる

Functions 機能の利用
EL 式から Functions 機能を利用して、static で定義されたメソッドを呼び出すことが可能
コンテキストルート│ FunctionsTest.jsp│└─ WEBWEB-INF│ FuncTest.tld│└─ classes/com
FuncTest

Functions を使用する JSP ファイルを配置

tld ファイルを配置

static メソッドを実装したクラスファイルを配置

static メソッドの実装
pakage com
public class FuncTest {public static String boo( int num) {// 各種処理}

以下の条件を満たしていること
パッケージ化されたクラス
クラスは、public
メソッドは public static

tld ファイルの作成
作成したメソッド情報を登録する tld ファイルを作成し、コンテキストルート/WEB-INF 以下へ配置する<taglib><tlib-version>バージョン</tlib-version><jsp-version>バージョン</jsp-version><function><name>JPS で呼び出す任意の関数名</name><function-class>クラス名</function-class><function-signature>
メソッドのシグネチャ</function-signature></function></taglib><taglib><tlib-version>1.0</tlib-version><jsp-version>2.1</jsp-version><function><name>FuncCall</name><function-class>com.FuncTest</function-class><function-signature>java.lang.String boo(int)</function-signature></function></taglib>※バージョンは必須属性なので省略すると実行時にエラーが発生する

Functions の呼び出し// uri には tld ファイルの格納場所または、web.xml の <taglib uri="">で指定した名称を入れる// prefix は JSP 内で該当のメソッド内で使用する接頭子を指定（任意の値）<%@ taglib uri="/WEB-INF/FunctionTEST.tld" prefix="myF" %>// 関数呼び出し（関数の引数に関数の戻り値を使う場合においても都度、prefix:関数名 と記載する）${myF:FuncCall(30)} // <function><name>要素で指定した名前(FuncCall)で関数をコールする// static クラスの関数名じゃないことに注意！

■標準アクションを使用した JSP の構築
標準アクションタグ
特定の振る舞いを指示するタグとして、その機能に割り付けている（オブジェクトの生成、フォワードなど）
タグ

説明<jsp:useBean>

JavaBeans の呼び出し<jsp:setProperty>

JavaBeans の setter メソッド呼び出し<jsp:getProperty>

JavaBeans の getter メソッド呼び出し<jsp:forward>

他のリソースへフォワードする<jsp:include>

他のリソースをインクルードする<jsp:param><jsp:include page="ファイル" flush=" true | false " />追加パラメータの設定を行う <jsp:param name="username" value="kawasumi" /><jsp:forward><jsp:plugin><jsp:forward page="forward.jsp" /><jsp:include><jsp:params>タグの子タグとして利用可能

Web ブラウザにアプレットを実行<jsp:params>

パラメータの集合を定義<jsp:fallback>

プラグインが起動できない場合に、クライアントのブラウザで使用するコンテンツを指定<jsp:attribute>

属性を定義する<jsp:element>の子タグとしても使用<jsp:body>

ボディ要素を定義する<jsp:invoke>

JSP フラグメントを出力（タグファイルでのみ使用可能）<jsp:doBody>

カスタムタグのボディを出力（タグファイルでのみ使用可能）<jsp:element>

XML 要素を追加する<jsp:text>

XML 表記の JSP においてテキスト部分を記述する<jsp:output>

XML 表記の JSP において出力形式を定義する<jsp:element>の子タグとしても使用<jsp:forward>
同じコンテキストルート以下にある他の JSP やサーブレットに転送する【書式】<jsp:forward page="ファイルパス" />ファイルパスは、コンテキストルートからの絶対パスまたは、該当 JSP からの相対パス、式、EL での指定が可能<jsp:forward page="<%=request.getParameter('page')%>" />や<jsp:forward page="${param.page}" /><jsp:include>
同じコンテキストルート以下にある他の JSP やサーブレットを動的に取り込む【書式】<jsp:include page="ファイルパス" flush=" true | false " />flush 属性は、コンテンツを取り込む際にバッファをフラッシュするか。する場合は true を指定

取り込むタイミング<%@ include file><jsp:include page>

コンパイル時HTTP リクエスト時

取り込み可能リソース

HTML、JSP

HTML、JSP、サーブレット

その他

そのページで宣言したフィールドやメソッ<jsp:param>タグによるパラメータ引渡しが可能

ドを取り込み先リソース内で使用可能<jsp:param><jsp:forward><jsp:include><jsp:params>タグの子タグとして定義し、それぞれのアクションが実行される際にパラメータを追加するために使用する（request オブジェクトに格納される）
既存の名前を指定した場合、先頭に値が追加される【書式】<jsp:param name="名前" value="値" />パラメータは、${param.名前} または <%= request.getParameter("名前") %>パラメータが複数の場合はで取得する${paramValues.名前[0]} または <%= request.getParameterValues("名前")[0] %>JavaBeans に対するアクションタグ
JavaBeans とはプラットフォームに依存しない Java 言語で書かれたコンポーネントモデルの事（要するにクラスファイル）
システム内で利用するクラスのうち「こういうクラスがあると便利」と考えられ、仕様化されたものが JavaBeans
JavaBeans の仕様に従って作られたコンポーネントを Bean と呼ぶ

JavaBeans の仕様① public 指定のクラス② public 指定の引数なしのコンストラクタを定義③ パッケージ化する④ クラスをシリアライズ可能とする（java.io.Serializable インターフェースを実装する）
Serializable には抽象メソッドはないため、クラス宣言で、implements Serializable を記述するだけでよい⑤ メンバ変数に対する setter/getter メソッドを用意する（例）JavaBeans の仕様に従ったサンプル
package com;public class EmpBean implements java.io.Serializable {private int id;
private String name;public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}public int getId() {return this.id;}
public String getName() {return this.name;}①パッケージ化する③④public のクラス、シリアライズ可能にする②コンストラクタ定義してないので、引数なしのコンストラクタが実装されてると同意⑤setter メソッドの用意
戻り値は void
メソッド名は、set<変数> で変数の先頭を大文字⑤getter メソッドの用意
戻り値は変数の型と同じにする}
int 型の setter メソッドの引数は、setID("124") のようにしても自動で型変換されずコンパイルエラーになる
必ず、setID(124) と記述すること

<jsp:useBean><jsp:useBean>
scope 属性で指定したスコープ内に id 属性で指定された参照名のオブジェクトがあるか確認、Bean 名を元にｲﾝｽﾀﾝｽ化した上で､id 属性に指定された参照名で参照する
存在しなければ、typeSpec で指定されたｸﾗｽ名や、【書式】<jsp:useBean id="参照名" [ scope="スコープ" ] typeSpec /><jsp:useBean id="参照名" [ scope="スコープ" ] typeSpec >様々な処理</jsp:useBean>※ボディ部はインスタンス化された場合のみ評価される（type 指定だとインスタンス化されないので評価されない）

id
必須属性で、任意の Bean を指定する

scope
Bean の参照できるスコープを選択
スコープ

有効期間

page

当該 JSP が実行されている間（省略時のデフォルト）

requestクライアント 1 回のリクエスト処理の間

sessionセッションに参加している間

application

該当 Web アプリケーションがサーバーで実行されている間

typeSpec
Bean に型を指定する、以下の何れかのパターン
TypeSec

説明class="クラス名"

完全修飾名でクラス名を指定。スコープ範囲に同名のインスタンスを探し出し、
存在しなければインスタンス化する。以下は同じ意味になる<jsp:useBean id="emp" class="com.EmpBean" /><% com.EmpBean emp = new com.EmpBean(); %>抽象クラスやインターフェースはインスタンス化できない為、エラーになる

type="型名"

抽象クラスやインターフェースの指定も可能（省略時は class と同じになる）
JavaBeans は作成されず、id 属性に指定した名前を用いてｽｺｰﾌﾟｵﾌﾞｼﾞｪｸﾄから
getAttribute メソッドでオブジェクトを取得する処理が実行される
class と異なりスコープ内にインスタンスが存在しなければ実行時例外となる<jsp:useBean id="emp" type="AbstractEmp" /><% AbstractEmp emp = (AbstractEmp)pageContext.getAttribute("emp"); %>class="クラス名" type="型名"<jsp:useBean id="emp" type="AbstractEmp" class="com.EmpBean" /><% AbstractEmp emp
if ((emp = (AbstractEmp)pageContext.getAttribute("emp")) == null {emp = new com.EmpBean();}%>beanName="Bean 名" type="型名"java.bean.Beans ｸﾗｽの instantiate()ﾒｿｯﾄﾞを使用してｲﾝｽﾀﾝｽ化したい場合に使用

（例）<jsp:useBean>タグの使用例
package com;public class Sample extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {EmpBean emp = new EmpBean();emp.setId(100);
emp.setName("kawasumi");HttpSession sid = request.getSession(true);sid.setAttribute("empob", emp);
RequestDispatcher rd =request.getRequestDispatcher("test.jsp");rd.forward(request, response);

Bean と同じパッケージを指定

JavaBeans の仕様に従ったクラスをｲﾝｽﾀﾝｽ化※ソースは前ページのサンプル参照
セッションスコープに、empob という名前でemp オブジェクトの内容を格納する

JSP ページへリダイレクトする}<jsp:useBean id="empob"
scope="session"
type="com.EmpBean" /><%= empob.getId() %><%= empob.getName() %>// 100// kawasumi

session ｵﾌﾞｼﾞｪｸﾄに empob という名前で格納されている
com.EmpBean クラスのｵﾌﾞｼﾞｪｸﾄを検索
session ｽｺｰﾌﾟに empob があるので､その値を取得
存在しない場合は実行時例外が発生する
type でなく class の場合は存在しない場合、
empob という名前でインスタンス化される<jsp:getProperty>
Bean の getter メソッドを通じて、フィールド（メンバ変数）を取得する（Bean に getter メソッドが定義されていること）【書式】<jsp:getProperty name="参照名" property="フィールド名" />
属性

説明

name

<jsp:useBean>タグの id 属性で指定した名前と同じ参照名を指定

property

アクセスしたいフィールド名を指定（getter メソッドの get を除去し、先頭 1 文字を小文字にした値）<jsp:setProperty>
Bean の setter メソッドを通じて、フィールド（メンバ変数）に値をセットする（Bean に setter メソッドが定義）【書式】<jsp:setProperty name="参照名" property="フィールド名" [ value="値" | param="パラメータ名" ] />
属性

説明

name

<jsp:useBean>タグの id 属性で指定した名前と同じ参照名を指定

property

アクセスしたいフィールド名を指定（setter メソッドの set を除去し、先頭 1 文字を小文字にした値）*の指定が可能。リクエストパラメータの値を自動的に Bean のフィールドにセットする※リクエストパラメータ名と Bean のフィールド名が一致している必要がある

value

フィールドにセットする値を指定する（省略した場合は null がセットされる）

param

フィールドにセットする値をリクエストパラメータで指定する（例）<jsp:setProperty><jsp:getProperty>タグの使用例<HTML><BODY><FORM method="POST" action="/Webapps/Sample.jsp">
id<INPUT type="text" name="id">name <INPUT type="text" name="name"></FORM></HTML></BODY>

リクエストパラメータを id と name にする<jsp:useBean id="empob" scope="session"class="com.EmpBean" /><HTML><BODY>

リクエストオブジェクト内に empob という名前で格納された com.EmpBean クラスのオブジェクト検索をするが存在しないためインスタンス化される<%= empob.getID() %><%= empob.getName() %>インスタンス化直後の為、初期値の 0
null が返される<jsp:setProperty name="empob" property="*" />*指定の為、リクエストパラメータ(id と name)がcom.EmpBean クラスの id と name にセットされる<jsp:getProperty name="empob" property="id" /><jsp:getProperty name="empob" property="name" />// <% out.println(empob.getId()); %> と同じ動作

empob オブジェクトの id を取得
empob オブジェクトの name を取得<jsp:setProperty name="empob" property="name"param="id" />リクエストパラメータ id の値を
com.EmpBean クラスの name にセットする■タグライブラリを使用した JSP の構築
タグライブラリ

タグハンドラクラス（カスタムタグの仕様に従って実装された Java コード）を複数まとめたものをタグライブラリと言うカスタムタグとタグハンドラクラスを関連付ける為に tld ファイルが必要
JSP で、カスタムタグを定義することで、タグハンドラクラスの Java コードが実行できる

JSTL
Web アプリケーションサーバーでも共通して使用できるタグライブラリで 5 つのライブラリで構成されている
ﾗｲﾌﾞﾗﾘ名

uri

prefix説明

core

http://java.sun.com/jsp/jstl/corec

変数のアクセス、繰り返し、条件分岐

XML

http://java.sun.com/jsp/jstl/xmlx

XML ドキュメントの操作

fmt

http://java.sun.com/jsp/jstl/fmt

fmt

データフォーマット、国際化対応

sql

http://java.sun.com/jsp/jstl/sql

sql

RDBMS のデータ操作

functions

http://java.sun.com/jsp/jstl/functions

fn

文字列、コレクションの操作

JSTL を利用するには、コンテキストルート/WEB-INF/lib 以下に、jstl.jar、standard.jar を配置する必要がある

JSTL の利用方法
JSTL はハンドラクラスが定義済みの為、タグを呼び出すだけで使用可能【書式】<%@taglib uri="uri 情報" prefix="接頭辞" %>または<jsp:root>の要素として定義<jsp:root xmlns:接頭辞="URI"></jsp:root>uri の定義
tld ファイルのパスを指定する。以下の 3 つの方法の何れかで指定する(1) 直接指定
コンテキストルートからの絶対パス（/から始める）または、定義している JSP からの相対パス（例）絶対パスで指定<%@taglib uri="/WEB-INF/test.tld" prefix="test" %>(2) web.xml ファイルで指定
tld ファイルのパスを予め web.xml に指定しておき、taglib ディレクティブには、
web.xml で定義した<taglib-uri>の値を記述する
XXX.jsp<%@taglib uri="http://test.com/taglib" prefix="test" %>web.xml<jsp-config><taglib><taglib-uri>http://test.com/taglib</taglib-uri><taglib-location>/WEB-INF/test.tld</taglib-location></taglib></jsp-config>

web.xml の <taglib-uri>の値を指定する

任意の文字列を定義する
tld ファイルの場所をコンテキストルートからの絶対パスで指定する(3) tld ファイルの<uri>タグで定義された uri を指定
この方法は、WEB-INF ディレクトリ以下（サブディレクトリも可）か、JAR ファイルに圧縮されている場合は、META-INF ディレクトリ以下（サブディレクトリも可）に配置する必要がある
XXX.jsp<%@taglib uri="http://test.com/taglib" prefix="test" %>test.tld<taglib><uri>http://test.com/taglib</uri>・・・</taglib>

tld ファイルの<uri>の値を指定する

任意の文字列を定義する

standard.jar の META-INF 以下に tld ファイルが入っており、<uri>タグに JSTL の uri の値が入っている
JSTL を利用する場合は、以下のように定義するだけで良い<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>core ライブラリ
タグ名

説明<c:out>変数の値を表示<c:set>変数に値を設定<c:remove>

指定されたスコープに格納されている属性を削除する（省略時は page スコープから順に検索）<c:forEach>

繰り返し処理<c:forTokens>

指定された区切り文字に従って分割し、分割された文字列を順次処理<c:if>

条件が true の場合に body 部が実行される<c:choose>

多分岐、属性を持たない代わりに以下の子タグを定義する

<c:when>

行いたい条件の数だけ指定<c:otherwise>

何れの条件にもマッチしない場合<c:catch>

例外処理を定義。J2SE の catch{}と同じ機能。発生した例外は page スコープに格納される<c:import>

ファイルのインポート<c:url>url の生成とエンコード。javax.servlet.http.HttpServletResponse#encodeURL()と同じ機能<c:redirect>

リダイレクト<c:param><c:import><c:url><c:redirect>

で使用するパラメータを定義<c:out>【書式】<c:out value="EL 式 | JSP 式" [ default="文字" escapeXml="true|false" ] />
属性

説明

value

出力させたい値を、EL 式か、JSP 式で指定する。文字列を入れると、その文字列がそのまま表示される

default

value が null だった場合に表示させる文字列（ボディタグにデフォルトの値を記述することも可能）

escapeXml< > & ' " を HTML エンティティに置換する（デフォルトは true で置換させて表示する）<% pageContext.setAttribute("pg", "PAGE"); %><%= pageContext.getAttribute("pg") %><c:out value="${pg}" default="null" /><c:out value="${ts}">null</c:out>
${pg}

表示結果
PAGE
PAGE
null
PAGE

<c:set>【書式】<c:set var="変数名" value="値" scoop="スコープ" /><c:set target="ｵﾌﾞｼﾞｪｸﾄ" propery="ﾌﾟﾛﾊﾟﾃｨ名|Map のｷｰ名" value="値" scoop="スコープ" />
属性

説明

var

変数名を指定value

セットする値。値はボディで指定することも可能

scoop

変数を格納する JSP スコープ（page、request、session、application）デフォルトは pagetargetsetter メソッドを持つ JavaBeans または Map オブジェクトの参照を指定する（EL 式か JSP 式で記述）

propery

target と一緒に使用し、JavaBeans のプロパティ名 または Map のキーを指定<%
com.EmpBean emp = new com.EmpBean();pageContext.setAttribute("eo", emp);
java.util.Map<String, String> map =new java.util.HashMap<String, String>();pageContext.setAttribute("mp", map);%><c:set var="変数名">値</c:set>

JavaBeans を設定する
Map ｵﾌﾞｼﾞｪｸﾄを定義
Map ｵﾌﾞｼﾞｪｸﾄを設定する

表示結果<c:set var="var" value="TEST" /><c:out value="${var}" />TEST<c:set target="${eo}" property="name" value="mai" /><c:out value="${eo.name}" />com.EmpBean の setName("mai")を実行している
mai<c:set target="${mp}" property="key" value="yuki" /><c:out value="${mp.key}" />map ｵﾌﾞｼﾞｪｸﾄに key というｷｰで、yuki という値を設定
yuki

<c:remove>【書式】<c:remove var="変数名" scope="スコープ">
スコープを省略すると全てのスコープの値を削除する<c:forEach>【書式】<c:forEach begin="開始値" end="終了値" [step="増分値" var="変数名" varStatus="変数名"]>// for 文と同じ動きになる</c:forEach>【書式】<c:forEach items="集合ｵﾌﾞｼﾞｪｸﾄ" [var="変数名" varStatus="変数名"]>// 拡張 for 文と同じ動きになる</c:forEach>
属性

説明

var

items から取り出した要素を格納する変数名（for 文での使い方ではカウント値が格納される）

items

集合オブジェクト（以下の何れか）を EL 式または JSP 式で指定
Collection、Map、Iterator、Enumeration、javax.servlet.jsp.jstl.sql.Result
配列、カンマ区切りの文字データ
begin/end を指定しない場合は、格納されている要素の数だけ繰り返す

begin

ループ開始位置end

ループ終了位置

step

ループの増分値

varStatus

ループ中のステータスを格納する変数を定義
この変数のフィールドにアクセス（変数名.フィールド）することで様々な情報が取得できる

ﾌｨｰﾙﾄﾞ

説明

備考

currentvar 属性で指定した変数に格納されている現在のオブジェクト

Object 型を格納

index

現在のループインデックス番号

ゼロから開始した番号

count

現在のループ回数

1 から開始した番号で 1 ずつ増加

first

現在がループの先頭か先頭で ture

last

現在がループの終端か終端で true

begin

begin 属性に指定した値

指定してなければ nullend

end 属性に指定した値

指定してなければ nullstep

step 属性に指定した値

指定してなければ null<%@ page import="java.util.*" %><%List<String> list = new ArrayList<String>();list.add("1");list.add("2");list.add("3");request.setAttribute("list",list);%><c:forEach var="obj" items="${list}" varStatus="vars"><c:out value="${obj}"/><c:out value="${vars.current}"/></c:forEach>list 内に格納されている要素を順番に取り出しobj に格納する
1 2 3 の順に表示される
1 2 3 の順に表示される

<c:forTokens>【書式】<c:forTokens items="分割対象文字列" delims="区切り文字"[ var="変数名" begin="開始値" end="終了値" step="増分値" varStatus="変数名" ] >// 各種処理</c:forTokens>
属性

説明

items

分割対象の文字列

delims

分割対象となる区切り文字列

var

items から取り出した要素を格納する変数名

begin

分割された文字列の取り出す位置を指定（初期値は 0）end

分割された文字列をどこまで取り出すか

step

ループの増分値

varStatus

ループ中のステータスを格納する変数を定義<c:if>【書式】<c:if test="条件式" [ var="変数名" scope="スコープ" ] > 真の場合に実行される処理 </c:if>
属性

説明

test

条件式（EL 式の演算子を使用）

var

条件式の結果（true か false）を格納する変数

scope

var 属性に定義した変数のスコープ（省略時は page）

test="${requestScope.num => 10}"

<c:choose>【書式】<c:choose><c:when test="条件式">必要な分だけ列挙、一致した時点でボディ部の処理実行</c:when><c:otherwise>上記の条件の何れもマッチしない場合</c:otherwise></c:choose><c:catch>【書式】<c:catch [ var="変数名" ] >

各種処理

属性

説明

var

例外オブジェクトを格納する変数</c:catch><c:catch var="ex"><% if (true) {throw new Exception("例外が発生しました");}%></c:catch><c:out value="${ex.message}" /> // 例外が発生しました が画面上に出力される

<c:param>【書式】<c:param name="パラメータ名" [ value="値" ] /><c:param name="パラメータ名">[ value="値" ]</c:param>
属性

説明

name

追加したいパラメータ名

value

パラメータに対する値<c:import>【書式】<c:import uri="URI" [ context="/ｺﾝﾃｷｽﾄ名" charEncoding="ﾘｿｰｽの文字ｺｰﾄﾞ"
var="変数名" varReader="変数名" scope="スコープ" ] />
属性

説明

uri

取り込むリソースのパス。コンテキストルートからの絶対パスまたはファイルからの相対パス

context

他のコンテキストにあるリソースを取り込む場合に指定。/コンテキスト名で指定

charEncoding

取り込んだリソースの文字コードを指定

var

取り込んだリソースを文字列として変数に格納する（格納することで標準出力しなくなる）

varReader

取り込んだリソースをバイナリ（java.io.Reader ｵﾌﾞｼﾞｪｸﾄ）として格納する

scope

var や varReader で格納した値のスコープを指定

Windows-31Jや UTF-8 など

子タグで<c:param>を指定した場合、取り込んだファイル内で ${param.変数名}で取得可能<c:url>【書式】<c:url value="ｴﾝｺｰﾄﾞ対象 URL" [ context="ｺﾝﾃｷｽﾄ名" var="変数名" scope="スコープ" ] />
属性

説明

value

エンコードしたい URL を指定

context

別コンテキストの URL を対象とする場合に指定

var

エンコードした URL の結果を標準出力ではなく変数に格納する場合に指定

scope

var 属性で格納した値のスコープを指定（省略時は page）

value="/hello"→/ｺﾝﾃｷｽﾄﾙｰﾄ/hello;jsession～となる

子タグで<c:param>を指定した場合、URL のパラメータとして付与される http://～/?name=kawasumi&age=17<c:redirect>【書式】<c:redirect url="ﾘﾀﾞｲﾚｸﾄ先 URL" [ context="ｺﾝﾃｷｽﾄ名" ] />
属性

説明

url

リダイレクト先の URL を指定

context

別コンテキストの URL へリダイレクトする場合に指定子タグで<c:param>を指定した場合、取り込んだファイル内で ${param.変数名}で取得可能■カスタムタグの作成
独自タグハンドラクラス
JSTL ではライブラリ内にタグハンドラのクラスファイルだけでなく tld ファイルも提供されていたが、独自のカスタムタグを作るには tld ファイルも自作する必要がある。主なタグは以下の通り<taglib>の子要素<taglib>

説明<tlib-version>

カスタムタグのバージョン<short-name>カスタムタグの略称<uri>

任意の文字列。JSP の<%@ taglib uri="値" >と同じ値になる
web.xml の<taglib><taglib-uri>の要素が定義されている場合は、web.xml が優先される<tag>

個々のタグの動作を指定<name>

タグハンドラの別名。JSP ではこの名前を使用<tag-class>

タグハンドラのクラス名を完全修飾子で記述<body-content>

JSP でカスタムタグを呼び出した際のボディ内容タイプを指定
empty

ボディ内容なし（ボディの内容記載したら実行時エラー）

JSP

ボディを JSP として評価（デフォルト）
SimpleTag のハンドラクラスでは使用できない<variable>

tagdependent

ボディを評価せず、そのまま取得

scriptless

スクリプティング<% %>や<%= %>禁止

テキスト、JSP、EL 式は許可

ハンドラクラス内で定義した変数を JSP でも参照できるようにする<name-given>

スクリプティング変数の名前が固定的に決まっている場合に変数の名前を指定<name-from-attribute>

スクリプティング変数の名前がカスタムタグの属性の値によって決まる場合に属性を指定<alias>ﾀｸﾞﾌｧｲﾙ内で使用する変数のローカル名。<name-from-attribute>を指定した場合は必須<variable-class>

変数の型を指定。デフォルトは java.lang.String<scope>スクリプティング変数が使用できるスコープを指定
AT_BEGIN

カスタムタグの開始から、スコープの終わりまで

AT_END

カスタムタグの終了から、スコープの終わりまで

NESTED

カスタムタグに囲まれた部分まで（デフォルト）<attribute>

属性に関する設定（複数の属性を指定する場合は、attribute を複数作成する）<name>

属性名を指定。タグハンドラクラスでこの名前の setter メソッドを定義する<name>name</name>→ public void setName(String name)<required>属性が必須か（デフォルトは false で省略可能）<rtexprvalue>

属性に ${} や <%= %> を使用できるか（false）<fragment>

属性がフラグメントか（false）<type>

属性値のデータ型を完全修飾子で指定（java.lang.String）<dynamic-attributes>

動的属性を使用するか（false）
使用する場合は、javax.servlet.jsp.tagext.DynamicAttributes ｲﾝﾀｰﾌｪｰｽを実装すること

DynamicAttributes

インターフェースのメソッド

メソッド

説明

void setDynamicAttribute(setter メソッドで定義してない属性を引数に指定した場合に実行されるString uri, String localName,

uri：属性の名前空間（デフォルトは null）

Object value )value：属性の値

localName：属性の名前

カスタムタグ API
カスタムタグは提供されている API（javax.servlet.jsp.tagext パッケージ）を利用して作成する
タグハンドラクラスは必ず、javax.serblet.jsp.tagext.JspTag インターフェースを実装する必要がある
JspTag インターフェースにはメソッドはない（タグハンドラクラスの為のマーカーインターフェース）

クラシックタグハンドラは、JSP1.2 以前のカスタムタグ API を用いて作成するタグハンドラクラス
シンプルタグハンドラは、JSP2.0 で追加されたカスタムタグ API を用いて作成するタグハンドラクラス

Tag インターフェース

メソッド

説明

void setPageContext(PageContext pc)

doStartTag()の前に呼び出され PageContext オブジェクトをハンドラに渡す

int doStartTag()

開始タグで処理を行う。戻り値は開始タグ処理以降の処理を指示する定数を指定

int doEndTag()

EVAL_BODY_INCLUDE

ボディを評価して出力バッファに結果を含める

SKIP_BODY

ボディを評価せず次の処理へ進む

終了タグで処理を行う。戻り値は終了タグ処理以降の処理を指示する定数を指定
EVAL_PAGE

タグ処理後にある残りの JSP ページを処理する

SKIP_PAGE

タグ処理後にある残りの JSP ページを処理しない

void release()

タグハンドラが解放される直前に呼び出される

void setParent(Tag t)

親タグが存在する場合、その親タグをあらわす Tag ｵﾌﾞｼﾞｪｸﾄをセットする(例) public void setParent(Tag parentTag) { this.pTag = parentTag; }Tag getParent()

親タグを表す Tag ｵﾌﾞｼﾞｪｸﾄを取得する

void setXxx(引数)タグに属性が設定されている際に、その属性値を設定する set メソッド
Xxx には、属性名の先頭を大文字、以降を小文字にした文字列を入れる(例)

public void setName(String name) { this.name = name; }（例）ボディタイプに JSP、ハンドラクラスの変数を定義、属性を付与したサンプル
TLD ファイル
<taglib><tlib-version>1.0</tlib-version><jsp-version>1.2</jsp-version><short-name>test</short-name><uri>http://Ctag/</uri><tag><name>HelloTest</name><tag-class>com.Ctag</tag-class><body-content>JSP</body-content><variable><name-given>samVar</name-given><scope>NESTED</scope></variable><attribute><name>name</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag></taglib>
タグハンドラクラス(抜粋)public class Ctag implements Tag {private PageContext pc;
private Tag t;
private String name;// 属性が必須で、EL 式が使用可能<test:HelloTest name="kawasumi">// <body-content>が JSP の為、ボディは JSP として解釈
doStartTag() の戻り値が EVAL_BODY_INCLUDE の場合はここに記述されたボディ部分を評価する</test:HelloTes>// doEndTag()の戻り値が EVAL_PAGE であれば、// 以降の JSP も処理される// 上記と同じことを JSP 標準タグで行う場合は以下になる<test:HelloTest><jsp:attribute name="name">kawasumi</jsp:attribute><jsp:body>ボディの内容を記述</jsp:body></test:HelloTest><test:HelloTest>${samVar} // ハンドラクラスで定義されている値を表示</test:HelloTest>

Tag インターフェースを実装

attribute で定義した引数の値を格納する変数

public void setPageContext(PageContext pc) {this.pc = pc;}
public void setParent(Tag t) {this.t = t;}

setPageContext、setParent、setXxx メソッドは特別な初期処理を行わない限り、このパターンの記述で良い

public void setName(String name) {this.name = name;}

属性に指定された値を保存する set メソッドを実装
JSP で定義した引数が当該メソッドの引数になる

public int doStartTag() throws JspException {try {カスタムタグが定義された時に実行される処理を記述

pc.setAttribute("samVar", "値");
JspWriter out = pc.getOut();
out.print(name);} catch(Exception e) {throw new JspException(e.getMessage());}
return EVAL_BODY_INCLUDE;}
public void release() {}}JSP ファイル
<%@ taglib uri="http://Ctag/" prefix="test" %><variable><name-given>に変数を定義することで、ここで設定した値を JSP 内で出力できる ${samVar}
出力ストリームの取得
setName で格納されている name の値を表示
今回の例だと、kawasumi と表示される

カスタムタグのボディ部分を出力する

IterationTag インターフェース

メソッド

説明

int doAfterBody()

ボディ部の評価が終了後、実行される
EVAL_BODY_AGEIN

ボディを再評価する（JSP のボディタグ評価後、再度当該関数をコール）

SKIP_BODY

ボディを評価せず次の処理へ遷移する

BodyTag インターフェース

メソッド

説明

void setBodyContent(BodyContent b)

タグボディオブジェクトである bodyContent が渡される
doEndTag()がコールされるまでこのオブジェクトは使用できる
doStartTag() で EVAL_BODY_BUFFERED が返った場合のみコールされる

void doInitBody()

setBodyContent()後、最初にボディが評価される前に呼び出される

BodyContent クラスメソッド

説明

void clearBody()

ボディをクリアにする

abstract Reader getReader()bodyContent の値を Reader オブジェクトとして返す
BufferedReader br = new BufferedReader(bodyContent.getReader());

abstract String getString()

bodyContent の値を String オブジェクトとして返す

JspWriter getEnclosingWriter()bodyContent が内包している JspWriter を取得する(例)ボディの内容を出力する
bodyContent.getEnclosingWriter.print(bodyContent.getString());

タグの入れ子処理
カスタムタグは入れ子での記述が可能。親タグから順番に実行される。また他のタグのメソッドを利用することも可能<tagA:ClassA num="5"><tagB:ClassB name="kawasumi"><tagC:ClassC /></tagB:ClassB></tagA:ClassA>

実装

メソッド

説明

Tag 及びTag getParent()

親のタグハンドラを取得する、ClassC.java で以下のコードを記載した場合、SimpleTag（例）ClassB bTag = (ClassB)getParent()

ｲﾝﾀｰﾌｪｰｽ

取得したタグハンドラにて、bTag.getName()などメソッドの実行が可能

TagSupport

static final Tag

引数 1 のクラスから、引数 2 の型（実装クラスやサブクラスを含む）に及び

findAncestorWithClass(

一致するものが見つかるまで getParent()を繰り返す

SimpleTag

Tag form, Class class)（例）ClassA aTag = (ClassA)findAncestorWithClass(this, ClassA.class)

SimpleTag インターフェース

メソッド

説明

void doTag()

タグが呼び出された際に実行される

void setJspBody(JspFragment jspBody)

ｲﾝｽﾀﾝｽ化の際、タグボディオブジェクトである JspFragment が渡される

void setJspContext(JspContext pc)

現在の JSP コンテキストオブジェクトが渡される

JspTag getParent()

親タグが存在する場合、その親タグをあらわす JspTag ｵﾌﾞｼﾞｪｸﾄを取得する

void setParent(JspTag parent)

親タグが存在する場合、その親タグをあらわす JspTag ｵﾌﾞｼﾞｪｸﾄをセットする

SimpleTagSupport クラスの主なメソッド
メソッド

説明

static final JspTag findAncestorWithClass

引数 1 のクラスから、引数 2 の型（実装クラスやサブクラスを含む）に(JspTag form, Class<?> class)

一致するものが見つかるまで getParent()を繰り返す

JspFragment getJspBody()

JspFragment オブジェクトを取得する

JspContext getJspContext()

JspContext オブジェクトを取得する（例）ボディ部を評価するサンプル
public class CtagSimple extends SimpleTagSupport {public void doTag() throws JspException, IOException {JspWriter out = getJspContext().getOut();
JspFragment fragment = getJspBody();fragment.invoke(out);// fragment.invoke(null); でも良い}}

JSP で以下の記述があった場合、<cts:CtagSimple>${1 + 3} // ボディ部</cts:CtagSimple>
JSP で記述されたボディ部を評価し出力する
tld の<body-content>によって出力内容が変わる
scriptless だと 4、tagdependent は${1 + 3}
empty だと実行時に例外をスロータグファイルカスタムタグのロジックを Java クラス（ハンドラクラス）ではなく JSP ファイルで定義したもので以下の特徴がある
・拡張子は tag、tagx
・tld ファイルへのタグ登録が不要
・配置場所は /WEB-INF/tags ディレクトリ以下（JAR の場合は/META-INF/tags ディレクトリ以下）（例）タグファイルの簡単な例
tagfile.tag<%@ tag pageEncoding="Windows-31J" %>tagjsp.jsp// tagdir 属性で、tag ファイルの格納ディレクトリを指定<%@ taglib tagdir
prefix="tf" %>tagdir="/WEB-INF/tags"
gdir<b>Hello</b>// <prefix:拡張子を除外したタグファイル名><tf: tagfile /> // <b>Hello</b> に置き換わる

暗黙ｵﾌﾞｼﾞｪｸﾄ

型名

スコープ

requestjavax.servlet.HttpServletRequest のサブクラス

requestresponse

javax.servlet.HttpServletRespose のサブクラス

page

jspContext

javax.servlet.jsp.JspContext

page

sessionjavax.servlet.http.HttpSession

sessionapplication

javax.servlet.ServletContext

applicationout

javax.servlet.jsp.JspWriter

page

configjavax.servlet.ServletConfig

page

タグファイル専用ディレクティブタグ
tag ディレクティブタグ

JSP の<%@ page>と同じ役割【JSP 独自形式】<%@ tag 属性="値" [属性="値"]... %>【XML 形式】<jsp:directive.tag 属性="値" [属性="値"]... />主な属性

デフォルト値

display-namebody-contents

説明
タグファイルの表示名

scriptless

ボディ内部のタイプを指定（empty

dynamic-attributes

動的属性の名前を定義

exampleタグの使用例

language

java

タグファイルで使用する言語

importjava.lang.*

インポートするクラス名

tagdependent scriptless）

javax.servlet.*javax.servlet.jsp.*
javax.servlet.http.*
pageEncoding

ISO-8859-1

文字エンコーディング

isELIgnored

false

EL 式を禁止するか（true だと EL 式を使わない）

deferredSyntax

false

文字列リテラルや変数単位で文字シーケンス#{}を許可しない

AllowedAsLiteral
trimDirectiveWhitespaces

true で許可する（false で使用するとコンパイルエラー）
falsetrue でﾃﾞｨﾚｸﾃｨﾌﾞ間の空白のみからなるテキストを出力しない

attribute ディレクティブタグ【JSP 独自形式】<%@ attribute 属性="値" [属性="値"]... %>【XML 形式】<jsp:directive.attribute 属性="値" [属性="値"]... />主な属性

デフォルト値name

説明
属性名（必須）requiredfalse

属性指定を必須にするか

fragment

false

属性をフラグメントとして受け取るか

rtexprvaluetrue<%= %>による動的変化する値を指定可能か

type

java.lang.String

属性の型（例）属性を持たせたサンプル<%@ attribute name="val" type="java.lang.Integer" %>${val * 1.05}<%@ taglib tagdir="/WEB-INF/tags" prefix="prt" %><prt:tagfile val="1000"/>// 1050.0 と表示される

variable ディレクティブタグ【JSP 独自形式】<%@ variable 属性="値" [属性="値"]... %>【XML 形式】<jsp:directive.variable 属性="値" [属性="値"]... />

主な属性

説明

name-given

スクリプティング変数の名前が固定的に決まっている場合に変数の名前を指定

name-from-attribute

スクリプティング変数の名前がカスタムタグの属性の値によって決まる場合に属性を指定

alias

ﾀｸﾞﾌｧｲﾙ内で使用する変数のローカル名。<name-from-attribute>を指定した場合は必須

variable-class

変数の型を指定。デフォルトは java.lang.String

scope

スクリプティング変数が使用できるスコープを指定
AT_BEGIN

カスタムタグの開始から、スコープの終わりまで

AT_END

カスタムタグの終了から、スコープの終わりまで

NESTED

カスタムタグに囲まれた部分まで（デフォルト）（例）スクリプティング変数のサンプル
tagfile.tag<%@ variable name-given="myVar" scope="AT_BEGIN" %><% jspContext.setAttribute("myVar", "test" ); %><jsp:doBody />// ↑JSP のカスタムタグでボディ部を評価させる// ないと jsp の 1.ボディ内：${myVar} は出力されない

tag.jsp<%@ taglib tagdir="/WEB-INF/tags" prefix="prt" %><prf:tagfile>1.ボディ内：${myVar}</prt:tagfile>
2.ボディの外：${myVar}// AT_BEGIN だと 1 2 両方値（test）が出力される// AT_END だと 2 のみ値（test）が出力される// NESTED だと 1 のみ値（test）が出力される

タグファイル専用アクションタグ<jsp:doBody>
JSP 側で記述されたカスタムタグのボディを評価する
属性

説明

var

ボディを評価した結果を文字列として変数に格納する場合、変数名を定義

varReader

ボディを評価した結果を Reader 型として格納する場合、変数名を定義

scope

変数のスコープ範囲（page、request、session、application）

<jsp:invoke>
JSP 側で記述されたカスタムタグにおいて属性として渡された内容を評価する
属性

説明

fragment

実行するフラグメントの名前を定義（必須）var

フラグメントの処理結果を文字列として変数に格納する場合、変数名を定義

varReader

フラグメントの処理結果を Reader 型として格納する場合、変数名を定義

scope

変数のスコープ範囲（page、request、session、application）（例）属性値をフラグメントとして処理するサンプル
tagfile.tag<%@ attribute name="val" fragment="true" %><jsp:invoke fragment="val" />// ここで jsp の属性値が評価され出力される// 右記の jsp の場合、"属性値"という文字列が出力される

tag.jsp<%@ taglib tagdir="/WEB-INF/tags" prefix="tagfile" %><tagfile:tagFile><jsp:attribute name="val">
属性値</jsp:attribute></tagfile:tagFile>■JavaEE デザインパターン
JavaEE デザインパターンとは何かしろの問題が発生した際の解決策をカタログ化したも。JavaEE は 21 個ある
それ以外のパターンとして、MVC（Model View Controller）があり、Smalltalk での GUI 設計に用いられる概念
プレゼンテーション層：Interceptin Fileter

Front Controller

ビジネス層

Service Locator：Business Delegate

Transfer Object

MVC（
MVC（Model View Controller）
Controller）
アプリケーションの構成要素を、処理を行う Model、ユーザーインターフェースとなる View、制御を行う Controller の 3 つに分けて役割分担を明確にする
Controller

リクエストの受付及び View モデルの制御を行う。自身では表示画面の生成やロジックの実行は行わず、要求に応じてロジックの実行を Model に依頼し、その結果表示を View に依頼するJava 環境ではサーブレット、JavaBeans が担当

View

Model からデータを受け取り、結果画面の生成やクライアントへのレスポンスを行う
Java 環境では JSP や HTML が担当

Model

リクエストに応じたロジック実装、View に対してのデータの受け渡しを行う
Java 環境では JavaBeans、Java クラス、EJB が担当している

MVC を使用するメリット
・ 役割による分離が明確になることで独立性が確保され、開発作業の分担が安易になる・ コンポーネント間の依存関係を最小限に抑えられ、他の部分の変更による影響を受けにくく実装できる
これによりコンポーネントの再利用が高まる
・ 依存度が低いことで保守性も向上する

Intercepting Filter
クライアントがリクエストする度に行いたい共通の処理（エンコーディング方式、認証、ブラウザ情報の確認など）をロジックの中でコーディングすると同じコードが何箇所にも発生することになる。

Intercepting Filter は、アプリケーション本来の処理ではなく付随して必要となる処理に関しては別コンポーネントとして用意し、本来の処理の前後で行う手法。構造は以下の通り

clientFilterManager

TargetFilterChain

Filter前後に行うべき処理に別コンポーネント（Filter）を用意

FilterManager

フィルタ処理を管理する。FilterChain を作成し、処理を開始するプログラム

FilterChain

Filter を連結させる仕組みを持つプログラム

Filter

独立した処理機能を持つプログラム

Targetクライアントが要求したリソース

Intercepting Filter のメリット
・ フィルタを処理内容ごとに別コンポーネントとして管理することで保守性、拡張性が向上
・ フィルタ自体の柔軟な変更、追加、組み合わせが可能になる・ フィルタリングに関して新しいアーキテクチャが出現した際、既存のコンポーネントに影響を与えず利用できる

Front Controller
全てのリクエスト（ログイン処理、履歴の参照など）に対して最初に処理を行うコンポーネントを 1 つ配置する方法
clientFront
Controller

Application
Controller

CommandView

Front Controller

システム内で最初にリクエストを処理するポイント
Application Controller に委譲するプログラム

Application Controller

アクションとビューを管理するプログラム

Command

リクエストに応じた処理をするアクションを実行するプログラム

View

クライアントに返すビューを作成するプログラム

Front Controller のメリット
・ 複数のリクエストに共通する制御ロジックを一元管理することができる
・ 制御の一元管理により、不正アクセスのチェックなど保守性が向上する

Business Delegate
ビジネスサービスへのアクセスをカプセル化する手法
funcXX()を使用したいのに、lookup()、create()を経て漸く funcXX()が使えるような煩雑な手順をカプセル化する
リモートビジネスコンポーネントを呼び出す処理はデリゲートが吸収するため、lookup()などの一連の処理を隠蔽しつつ、Web コンポーネントはデリゲートに対して通常のメソッドを呼び出すだけでよくなる
clientBusiness Delegate

Business Service

Business Locator
Business Delegate

ビジネスサービスを制御し保護するプログラム

Business Locator

Business Service コンポーネントを検索する機能の実装をカプセル化するプログラム

Business Service

EJB オブジェクトといったビジネス層のコンポーネントを提供するプログラム

Business Delegate のメリット
・ Web 層コンポーネントはリモートアクセスを意識することなくビジネスロジックの呼び出しが行える
・ ビジネス層のコンポーネントに変更が生じた場合、変更の影響をデリゲートで吸収できる・ デリゲートが用意するメソッドを予め取り決めておくことで、Web 層とビジネス層の並行開発が可能になる・ デリゲートにキャッシュ機能を持たせることでパフォーマンスを上げることができる

Service Locator
クライアントは「どのサーバーで稼動しているネーミングサービスに」「何という名前でビジネスコンポーネントが登録されているか」を把握しておかなければルックアップすら出来ない
ビジネスコンポーネントやビジネスサービスのルックアップを実装しカプセル化する
clientService
LocatorRegistoy Service
Cache

Initial Context

TargetService Locator

ルックアップの複雑さ、ビジネスオブジェクトの生成をカプセル化して単純なインターフェースをクライアントに提供するプログラム

Cache

イニシャルコンテキストオブジェクトやファクトリオブジェクトをキャッシュするプログラム

Initial Context

ターゲットオブジェクトのルックアップ及び生成処理を開始するための入り口となるﾌﾟﾛｸﾞﾗﾑ

Targetビジネスコンポーネント、ビジネスサービスを提供するプログラム

Registry Service

Client のサービスプロバイダとして登録されている。サービスまたはコンポーネントへの参照を保持しているレジストリサービスを提供しているプログラム

Service Locator のメリット
・ サービスのルックアップをカプセル化することで複雑さが抽象化される・ クライアントコードに影響なくビジネスコンポーネントの追加を行うことができる

Transfer Object
DB のあるデータを取得する検索メソッドがあった場合、複数の値を取得するには、このメソッドを複数回実行する必要がある。ビジネスコンポーネントでは 1 回の DB アクセスで獲得した全てのフィールド値をトランスファーオブジェクトに格納する。これにより Web コンポーネントはメソッドの戻り値でトランスファーを取得することで、1 回の呼び出しで複数のフィールドの値を取得できる
clientConponent

Transfer Object

Transfer Object のメリット
・ 1 回のメソッド呼び出しで全てのフィールド値を取得できるため、ネットワークトラフィックが軽減される・ 複数のデータ受け渡しが 1 つのオブジェクトとして行えるため、実装が安易になる