独習Javaサーバサイド編第2版 第8章まとめ

アプリケーション共通の処理を定義する

フィルタ
JSPサーブレットなどのコンテンツが呼び出される際に一緒に呼び出され、補助的な処理を行うことを目的とした仕組み(生成されたコンテンツの圧縮、暗号化、ログ集計や認証など)
ソースの維持管理という面で、効率的

フィルタクラス定義に必要な条件
①Filterインタフェースを実装する
インタフェースを実装する場合、たとえそのメソッドが不要であってもメソッド自体の記述を省略することはできない
②初期化/終了処理はinit/destroyメソッドで定義
initメソッドはフィルタが初めて呼び出されるタイミングで呼び出される
destroyメソッドはフィルタクラスが破棄されるタイミングで呼び出される
③実処理はdoFilterメソッドで定義

doFilterメソッド(Filterインタフェース)
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
request:リクエスト情報
response:レスポンス情報
chain:フィルターチェーン
登録された次のフィルタを実行する(次のフィルタが存在しない場合、最初にリクエストされたページを処理する)

末尾には必ずFilterChainオブジェクトのdoFilterメソッドを記述しなければならない
FilterChainは登録済みフィルタの集合(フィルタチェーン)を管理するためのオブジェクト

doFilterメソッド(FilterChainインタフェース)
void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException
request:リクエスト情報
response:レスポンス情報
登録された次のフィルタを実行する(次のフィルタが存在しない場合最初にリクエストされたページを処理

リクエストデータの文字コードを宣言する

フィルタはURL指定やフォームの送信などで直接呼び出せない
web.xmlでフィルタがどのページで呼び出したタイミングで起動されるべきか宣言する必要がある
①フィルタ名とクラス名を関連づける
要素の役割
クラス名とファイル名は全く違くてもよい
定義されたファイル名は要素の中でフィルタの適用範囲を設定する際に使用する
要素にはフィルタクラス内で利用可能な初期化パラメータを指定する

getInitParameterメソッド(FilterConfigインタフェース)
String getInitParameter(String name)
name:初期化パラメータ名
デプロイメントディスクリプタで定義された初期化パラメータを取得する

②フィルタの適用範囲を決める
:登録済みのフィルタをどのリクエストに紐付けるか決定する

WebFilterアノテーションでフィルタを宣言する

@WebFilter(
urlPatterns= { URLパターン,... },
servletNames = { サーブレット名,...},
initParams = {
        @WebInitParam(name = "パラメータ名", value = "値"),
        @WebInitParam(name = "パラメータ名", value = "値"),...
},
dispatcherType = { ディスパッチャー,... }
}

リスナクラスでアプリケーションイベントを補足する

アプリケーションイベント
アプリケーションやセッション開始/終了、セッション/リクエスト属性の登録/削除など、アプリケーションの中で発生するイベントのこと
リスナはそれに対しなんらかの処理を行うクラスで、あらかじめ決められたタイミングでさまざまな共通処理を実行できる
リスナクラスを定義するには目的に応じて必要なインタフェースを実装する必要がある

Webistenerアノテーションでリスナを宣言する

@WebListenerアノテーションを利用することでweb.xmlレスでリスナを登録できる

アプリケーション開始時に必要なリソースをロードする

web.xmlの解析はそれなりに負荷の高い処理で、リクエストのたび読み込みにいくのは好ましくない
アプリケーション起動時にメモリにロードしてしまえばデータ読み込みの負荷を軽減できる

自作のタグライブラリを定義する

自作のアクションタグ(カスタムタグ)を作る
カスタムタグの実際の挙動を定義するのはタグハンドラクラス
・基本クラスを継承する
・タグの具体的な動作はdoStartTag/doEndTagメソッドで定義
・属性を設定するのはセッタメソッドの役割
・処理結果を出力するのはJspWriterクラス

タグライブラリディスクリプタを定義する

タグライブラリディスクリプタ(タグライブラリ記述子)とはカスタムタグに関する基本情報を記述するためのファイル
カスタムタグを定義したタグハンドラクラスと実際のタグ名とを関連づけ、同時にカスタムタグで利用可能な属性や本体などの情報を定義する
ファイル名は自由
拡張子は.tld配置先は/WEB-INF/taglibsフォルダとする必要がある
①ルート要素は要素であること
②タグライブラリの基本情報を定義する
③カスタムタグの仕様を定義する

タグライブラリディスクリプタの配置場所

標準以外のフォルダに配置したいときは、タグライブラリディスクリプタの検索先をデプロイメントディスクリプタに登録しておく

静的メソッドを式言語から呼び出す

JSP2.0以降、式言語を介してJavaの静的メソッドを呼び出すことができるようになった(Function,関数)
利用することで簡単な演算やデータ加工などのコードを.jspファイルからとりのぞける

システムプロパティを表示する関数を定義する

関数を動作させるのに必要なファイル
・静的メソッドを定義したクラスファイル(関数本体)
・タグライブラリディスクリプタ(.tldファイル)
・関数を呼び出すためのJSPページ
Functionから呼び出すメソッドを定義する際の注意
・静的メソッドとして定義すること(staticキーワードを付与すること)
・アクセス修飾子としてpublicを指定すること

カスタムタグと関数の使い分け

カスタムタグと関数は与えられタパラメータに基づいて、なにかしらの結果を返すという似たような役割を持っている
どちらもビュー層で利用できる
①戻り値をどのように使用するか
Function:そのままほかのカスタムタグの属性値として指定できる
カスタムタグ:タグどうしを入れ子にできるが直接の属性値としては指定できない
②引数の多寡
Function:カンマ区切り
カスタムタグ:属性値="値"
③引数の内容
Function:何行にもわたる文字列は苦手
カスタムタグ:長い引数でもスマートに表現可能
④暗黙オブジェクトへのアクセスが必要か
Function:ユーザの目的に直接関係しない引数を明示的に渡さなければならない