8.2.5 Servlet 2.5仕様で追加,変更された仕様についての注意事項
Servlet 2.5仕様で追加,変更された仕様を,アプリケーションサーバ上で使用するときの注意事項を示します。Servlet 2.5仕様およびServlet 2.4仕様については,それぞれの仕様書(Servlet 2.5仕様書,Servlet 2.4仕様書)を参照してください。
- 〈この項の構成〉
(1) web.xmlのXMLスキーマ変更について
アプリケーションサーバでは,Servlet 2.5仕様に従ってweb.xmlのXMLスキーマが変更されています。
(2) web.xmlの省略に関する注意事項
Servlet 2.5仕様では,web.xmlの省略について記述が追加されています。
アプリケーションサーバでは,WebアプリケーションがJSPおよび静的コンテンツしか含まない場合,web.xmlを省略できます。web.xmlが省略されたWebアプリケーションのバージョンは2.5と見なされます。また,web.xmlを省略した場合,WEB-INFディレクトリを省略できます。
ここでは次の項目についてのweb.xml省略時の注意事項について説明します。
-
サーブレット,フィルタ,リスナをアノテーションで定義しないWebアプリケーション
-
実行環境でのWebアプリケーションのプロパティの設定
-
マッピングの設定
-
フィルタの使用
web.xmlの省略については,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「16.4.5 web.xmlを省略したWebアプリケーションに対する操作」を参照してください。
(a) Webアプリケーションにサーブレットおよびフィルタが含まれている場合のweb.xmlの省略
サーブレット,およびフィルタはweb.xmlにマッピング定義が必要なため,web.xmlを省略すると動作しません。
(b) Webアプリケーションにリスナが含まれている場合のweb.xmlの省略
次に示すリスナはweb.xmlに定義が必要なため,web.xmlを省略すると動作しません。
-
javax.servlet.ServletContextListener
-
javax.servlet.ServletContextAttributeListener
-
javax.servlet.ServletRequestListener
-
javax.servlet.ServletRequestAttributeListener
-
javax.servlet.http.HttpSessionListener
-
javax.servlet.http.HttpSessionAttributeListener
ただし,次に示すリスナはweb.xmlに定義しないため,web.xmlを省略しても動作します。
-
javax.servlet.http.HttpSessionBindingListener
-
javax.servlet.http.HttpSessionActivationListener
また,タグライブラリでリスナが定義されている場合,web.xmlを省略してもリスナは実行されます。
(c) 実行環境でのWebアプリケーションのプロパティの設定
web.xmlを省略した場合,サーバ管理コマンドおよび属性ファイルを使用したプロパティの設定はできません。
(d) マッピングの設定
web.xmlを省略した場合でも,拡張子がjspおよびjspxのファイルのマッピング,デフォルトのwelcomeファイル,セッションタイムアウト,およびデフォルトのmime-mappingの設定は有効です。サーブレットのデフォルトマッピングの有効または無効の設定に関係なく,サーブレットのデフォルトマッピングは使用できません。
(e) フィルタの使用
web.xmlを省略したWebアプリケーションではフィルタを使用できません。そのため,アプリケーションサーバが提供するサーブレットフィルタ(built-inフィルタ)が必要な機能は使用できません。
(3) <load-on-startup>要素への空文字列の指定
Servlet 2.5仕様で定義されたweb.xmlのスキーマでは,<load-on-startup>要素に指定できる値が変更されました。
アプリケーションサーバでは,<load-on-startup>要素に指定できる値はweb.xmlに記述するServlet仕様のバージョン情報に対応したサーブレットに従って制御されます。サーブレットのバージョンごとに<load-on-startup>要素に指定できる値について次の表に示します。
サーブレットのバージョン |
指定できる値 |
---|---|
Servlet 2.5 |
整数,または空文字列。空文字列が指定された場合,<load-on-startup>要素が指定されなかった場合と同様に,サーブレットのロードを行わない。 |
(4) <security-constraint>要素でのHTTPメソッドの指定範囲について
Servlet 2.5仕様で定義されたweb.xmlのスキーマでは,<security-constraint><web-resource-collection>要素内の<http-method>要素に指定できる内容について変更されました。指定できる内容について次の表に示します。
サーブレットのバージョン |
指定できる内容 |
---|---|
Servlet 2.5以降 |
半角英数字(0-9,A-Z,a-z)および特殊文字(! # $ % & ' * + - . ^ _ ` | ~)を1回以上。 |
Servlet 2.4 |
GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACEのどれか。 |
<security-constraint><web-resource-collection>要素内の<http-method>要素に指定するのは,リクエストのHTTPメソッドです。
アプリケーションサーバでサポートするリクエストのHTTPメソッドは,web.xmlに記述するServlet仕様のバージョン情報に対応したサーブレットでサポートする内容と同じです。アプリケーションサーバでサポートするリクエストのHTTPメソッドについて次に示します。
サーブレットのバージョン |
指定できる内容 |
---|---|
Servlet 2.5以降 |
HTTP1.1で使用可能なすべてのメソッド。 |
Servlet 2.4 |
GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACEのどれか。 |
指定できない値を指定した場合,J2EEアプリケーションのインポートに失敗します。
(5) アノテーションの使用
アプリケーションサーバでは,Servlet 2.5仕様で規定されたアノテーションをサポートします。アノテーションの使用については,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「17. アノテーションの使用」を参照してください。
(6) Webアプリケーションの呼び出し時のHTTPセッションの継続について
Servlet 2.5仕様では,クロスコンテキストで呼び出されたサーブレットおよびJSP内でセッションを作成した場合,次のどちらの場合もセッションが継続するように記述が追加されています。
-
関連づけられたコンテキストに直接リクエストが来た場合のクロスコンテキストの呼び出し
-
ディスパッチ(javax.servlet.RequestDispatcherインタフェースのforwardメソッドおよびincludeメソッド呼び出し)によるクロスコンテキストの呼び出し
しかし,アプリケーションサーバでは,Webアプリケーションの呼び出し時のHTTPセッションの継続はできません。
(7) フィルタマッピングでのすべてのサーブレットの指定について
Servlet 2.5仕様では,web.xmlの<filter-mapping>要素内の<servlet-name>要素での*(半角アスタリスク)の指定について記述が追加されています。
web.xmlの<filter-mapping>要素内の<servlet-name>要素で*を指定することで,すべてのサーブレットへのリクエストをフィルタ呼び出しの対象にできます。
web.xmlでの定義例を次に示します。
<filter-mapping> <filter-name>All Filter</filter-name> <servlet-name>*</servlet-name> </filter-mapping>
この例では,すべてのサーブレットへのリクエストに対してフィルタ名「All Filter」のフィルタが呼び出されます。
- 注意事項
-
Servlet 2.4仕様に準拠したWebアプリケーションではフィルタマッピングで指定する*(半角アスタリスク)に特別な意味はありませんでした。しかし,Servlet 2.5仕様に準拠したWebアプリケーションでは*はすべてのサーブレットを意味します。サーブレット名が*のサーブレットだけを指定する方法はないため注意してください。
アプリケーションサーバでは,web.xmlの<filter-mapping><servlet-name>要素で*(半角アスタリスク)を指定した場合,該当するweb.xmlを含むWebアプリケーションへのすべてのリクエストがフィルタ呼び出しの対象となります。
(8) javax.servlet.ServletRequestインタフェースのsetCharacterEncodingメソッドの呼び出しの無効について
Servlet 2.5仕様では,javax.servlet.ServletRequestインタフェースのgetReaderメソッドが呼び出されたあと,setCharacterEncodingメソッドの呼び出しが無効になることについて明記されました。
アプリケーションサーバでは,サーブレットのバージョンに関係なく,Servlet 2.5仕様に従います。getReaderメソッド呼び出し後のsetCharacterEncodingメソッドの呼び出しは無効となり,次の内容は変更されません。
-
getReaderメソッドで取得したBufferedReaderオブジェクトが使用する文字エンコーディング
-
getCharacterEncodingメソッドの戻り値
(9) javax.servlet.http.HttpServletRequestインタフェースのgetRequestURLメソッドの戻り値となるURLの変更について
Servlet 2.5仕様では,forward先でjavax.servlet.http.HttpServletRequestインタフェースのgetRequestURLメソッドが呼び出された場合に戻り値となるURLについて,クライアントに指定されたURLのパスではなく,javax.servlet.RequestDispatcherオブジェクトを取得するために使用したパスが反映されることが明記されました。
アプリケーションサーバでは,web.xmlに記述するServlet仕様のバージョン情報に対応したサーブレットに従って,戻り値となるURLを決定します。
Servlet 2.5仕様では,javax.servlet.RequestDispatcherオブジェクトを取得するために呼び出したjavax.servlet.ServletRequestインタフェースのgetRequestDispatcherメソッドの引数に指定したパスが戻り値となります。Servlet 2.4仕様では,リクエストのURLのパスが戻り値となります。
(10) javax.servlet.http.HttpSessionインタフェースのgetIdメソッドが呼び出された場合の動作について
Servlet 2.5仕様では,無効化されたjavax.servlet.http.HttpSessionオブジェクトのgetIdメソッドが呼び出された場合にjava.lang.IllegalStateException例外がスローされる仕様が削除されました。
アプリケーションサーバでは,無効化されたjavax.servlet.http.HttpSessionオブジェクトのgetIdメソッドが呼び出された場合の戻り値は,web.xmlに記述するServlet仕様のバージョン情報に対応したサーブレットに従って制御されます。
Servlet 2.5仕様の場合はセッションID,Servlet 2.4仕様の場合はnullが戻り値となります。
(11) サーブレットのバージョンが異なるWebアプリケーション間でのクロスコンテキストの呼び出しについて
サーブレットのバージョンが異なるWebアプリケーション間でクロスコンテキストを呼び出した場合,呼び出し元と呼び出し先のサーブレットのバージョンによって,呼び出し先の動作が異なるメソッドがあります。サーブレットのバージョンが異なるWebアプリケーション間でのクロスコンテキストの呼び出しをした場合のクロスコンテキストの呼び出し先の動作について,メソッドごとに表に示します。
Webアプリケーションのサーブレットのバージョン |
クロスコンテキストの呼び出し先の動作 |
参照先 |
|
---|---|---|---|
呼び出し元 |
呼び出し先 |
||
Servlet 2.5以降 |
Servlet 2.4以前 |
Servlet 2.5仕様に従う。 |
|
Servlet 2.4以前 |
Servlet 2.5以降 |
Servlet 2.4仕様に従う。 |
Webアプリケーションのサーブレットのバージョン |
クロスコンテキストの呼び出し先の動作 |
参照先 |
|
---|---|---|---|
呼び出し元 |
呼び出し先 |
||
Servlet 2.5以降 |
Servlet 2.4以前 |
Servlet 2.5仕様に従い,セッションIDを返す。 |
|
Servlet 2.4以前 |
Servlet 2.5以降 |
Servlet 2.4仕様に従い,nullを返す。 |
(12) include先のサーブレットでのレスポンスヘッダの設定について
Servlet 2.5仕様では,include先のサーブレットでのレスポンスヘッダの設定について,getSessionの場合だけ設定が有効となります。ただし,アプリケーションサーバでは,Servlet 2.4を使用した場合でも,getSessionでのレスポンスヘッダの設定は有効になります。