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

デプロイメントディスクリプタ

(DeploymentDescriptor:配列記述子)はJSP&サーブレットにおける標準の設定ファイル
Webアプリケーションの配置情報を記述したxml形式の設定ファイル
Tomcatではweb.xmlという名前になる
アプリケーションルート配下の/WEB-INFフォルダに配置する
サーブレットの登録やセッション情報の設定、アプリケーションレベルの初期化パラメーターやウェルカムページ、エラーページ、認証の定義などアプリケーション全体にかかわる項目を設定できる

デプロイメントディスクリプタの基本

XMLの基本構文

XML(eXtensibleMarkuoLanguage)は標準化団体であるW3C(WorldWideWebConsortium)によって策定された拡張可能なマークアップ言語
HTMLに似たタグの形式で構造化されたデータを記述できる

1.主に要素と属性から構成される

要素:~のように文字列で囲まれた部分で、それ自体で独立したひとつのかたまりの情報を表す
属性:タグ内に属性名="属性値"のセットで記述され、要素が表す情報に対して付随的な情報を記述するのが一般的。タグ内にいくつでも記述できる

<要素名 属性名="属性値"...>任意のデータ</要素名>

要素名及び属性名は目的に応じて自由に決められる

2.XML文書であることを宣言しなければならない

先頭行に<?xml ?>を記述する

<?xml version="1.0" encoding="UTF-8" ?>

version属性はXMLのバージョンを、encoding属性はファイル内の文字コードを示す
使用している文字コードUTF-8のとき宣言は省略可

3.必ず開始タグで始まり、終了タグで終わらなければならない

終了タグを省略したい場合~/>で閉じる

4.すべての要素は正しくネスト構造になっていなければならない
5.唯一のルート要素を持たなければならない

XML文書の最上位には必ずルート要素(ドキュメント要素とも)がなければならない

6.要素/属性名の大文字/小文字は区別される
7.属性値はダブルクォートまたはシングルクォートで囲まなければならない

要素名と属性名の間は必ず半角スペースで区切る

8.コメントは<!--~-->で表す

コメントの中にコメントを入れ子で記述することはできない

web.xmlの配置先

2種類のレベルがあり、配置先が異なる
conf/web.xmlをアプリケーション開発者が編集すべきではない理由
●conf/web.xmlへの設定はすべてのアプリケーションに影響する
●アプリケーションを異なるサーバに配置した時に、配置先でもまたconf/web.xmlを編集し直さなければならない

特別な理由がない限りアプリケーション開発者は個々のアプリケーション配下のweb.xmlのみを編集するようにする

web.xmlの骨組み

デプロイメントディスクリプタのルート要素は< web-app>要素である
配下に子要素を含むことができる

初期化パラメータを定義する< context-param>要素

アプリケーション共通で利用可能な初期化パラメータを宣言する
リソースのパス、データベースへの接続情報、文字コード名などアプリケーションの複数箇所から共通して参照する可能性があり、かつ環境によって変動するような情報を指定しておく
アプリケーション配下のすべてのJSP&サーブレットから参照できる

初期化パラメータを取得する
要素
<context-param>
<param-name>    初期化パラメータ名
<param-value>   パラメータ値
<description>*  パラメータの概要

初期化パラメータにアクセスする手段を提供するのはServletContextインタフェースのgetInitParameterメソッドである
式言語利用の場合はServletContextインタフェースの代わりに暗黙オブジェクトinitParamを使用する

getInitParameterメソッド(ServletContextインタフェース)
String getInitParameter(String name)
name:初期化パラメータ名
<context-param>要素で定義した初期化パラメータを取得する
JSTLで利用可能な初期化パラメータ

JSTLではいくつかの初期化パラメータが用意されていて、web.xmlで管理できる

カスタムエラーページを設置する要素

アプリケーションで処理されない例外が発生した場合に表示されるエラー通知画面
404などの情報をみてもエンドユーザにはわかりにくいのと、クラッカーに情報を悪用されるのを防ぐためカスタムのエラーページを定義するのが一般的

要素
<error-page>
<error-code>        エラーコード(HTTPステータスコード)
<exception-type>    例外クラスの完全修飾名(<error-code>といずれかを設定)
<location>          <error-code>または<exception-type>の設定に応じて表示するエラーページ
カスタムエラーページを定義する

アプリケーション内部の構造を漏洩する可能性がある例外情報をクライアントに出力することは好ましくないが、これらの情報がどこにもないと、障害対応することもできないので裏でログとして記録する必要が有る
ログをテキストファイルとして記録する場合、エンドユーザからアクセスできないように/WEB-INFフォルダの配下に保存する

アプリケーションに認証機能を実装する

フォーム認証

ログイン画面を自由にレイアウトできる
認証の状態はセッションで管理されている
ログアウトするにはlogoutメソッドを呼び出す(サーブレット3.0から)

request.logout();

2.5以前ではinvalidateメソッドを利用する

session.invalidate();
フォーム認証機能を実装する

フォーム認証を実装するのに必要なファイル

●デプロイメントディスクリプタ(web.xml)
web.xmlの設定は< security-constraint>(制限ルール)、< login-config>(ログイン方法)、< security-role>(権限の宣言)の3ブロックに分かれる
●ユーザ情報ファイル(tomcat-users.xml)
ロール(権限)とはあるリソースへのアクセスの可不可を表す一種のユーザグループ
●ログインページ
ユーザ名/パスワードを表すフォーム要素のnameオプション、< form>タグのactionオプションの値にはあらかじめきれられたキーワードを設定する
●ログインエラーページ
htmlで書いてもいい

アクセス規則をアノテーションで記述する

ページ単位の細かなアクセス管理をしたいという場合利用する

@SecurityServletアノテーション
@ServletSecurity(
    @HttpConstraint(rolesAllowed = { 許可するロール名,... })
)
ユーザ情報をデータベースで管理する

1.DataSourceRealmを有効にする
2.ユーザ管理のためのテーブルを用意する
3.デプロイメントディスクリプタやログインページを用意する

独自のログインページを実装する

1.認証サーブレットを用意する
2.ログインページを修正する

@page/@taglibディレクティブの記述を省力化する

JSPページ内で日常的にタグライブラリを利用するようになるとページごとに@taglibディレクティブを記述するのが面倒になる
JSP2.0からJSPコンフィギュレーション(JSP構成)という仕組みが用意された
JSPページの共通設定やコードを.jspファイルから切り離して1箇所で管理できるようになる

共通のヘッダファイルを定義する

JSPコンフィギュレーション要素の配下で定義する
設定できる内容は大きく「JSPページの共通設定」と「タグライブラリの登録」に分類できる

< scripting-invalid>要素

スクリプティング要素の利用を禁止する

< el-ignored>要素

式言語を無視する

ウェルカムページを定義する

< welcome-file-list>要素を設定しておくとデフォルトページを優先的に表示する
エンドユーザによるURL入力の手間を軽減できる

ウェルカムページを設定する
要素
<welcome-file-list>
<welcome-file>+     ウェルカムページとするファイル名

複数の要素を指定できる

バージョンによる挙動の違い

要素が指定されたウェルカムページが見つからなかった場合の動作がTomcat4.xまでと5.0以降で違う
4.xまで:404NotFoundエラーを返すだけ
5.0以降:デフォルトサーブレット(値が/である< ulr-pattern>要素に関連づけられたサーブレット)を検索しようとする
デフォルトサーブレットとは値が/である< url-pattern>要素に関連付けられたサーブレットのこと

Tomcatサーバを管理するーserver.xml

server.xmlTomcatサーバを管理するためのTomcat固有の設定ファイルで、デプロイメントディスクリプタと同じくXML形式で記述する
< server>要素を頂点として、サーバの論理的な階層構造を表す
仮想ホストとは1つのサーバであたかも複数のホストが存在するかのように見せかける仮想的な仕掛けのことで、1つのサーバ内でURLをわけて運用することが可能になる

サーバ/クライアント間の接続を管理する< Connector>要素

< Connector>要素はサーバ/クライアント間の接続を管理するコネクタを定義する
Tomcatではport属性で指定されたポート番号によってどのコネクタで処理を行うか決定する
ポート番号が8009であるコネクタApacheなどのWebサーバを経由したリクエストを受け付けるためのコネクタ

アプリケーションの配布ー.warファイル

アプリケーションルート配下のサブフォルダ/ファイル全体を圧縮したアーカイブ
決められたフォルダに配置するだけでアプリケーションを利用できる

< Context>要素

アプリケーション単位の情報を定義する
要素は独立した設定ファイル(コンテキスト定義ファイル)として記述することが推奨されている

< Valve>要素

Valve(バルブ)とは、Tomcatに対する要求のタイミングで、なんらかの処理を割り込ませる仕組みのこと
アプリケーションのロギングやアクセス制限などを設定ファイルの記述だけで実現できる