8.2.6 Servlet 2.4仕様で追加,変更された仕様についての注意事項
Servlet 2.4仕様で追加,変更された仕様を,アプリケーションサーバ上で使用するときの注意事項を示します。Servlet 2.4仕様およびServlet 2.3仕様については,それぞれの仕様書(Servlet 2.4仕様書,Servlet 2.3仕様書)を参照してください。
- 〈この項の構成〉
(2) java.servlet.RequestDispatcherクラスのforwardメソッド利用時の注意
javax.servlet.ServletRequestクラス,およびjavax.servlet.ServletContextクラスのgetRequestDispatcherメソッドで取得したjavax.servlet.RequestDispatcherクラスのforwardメソッドを実行すると,リクエストオブジェクトには次のキーの属性が追加されます。ただし,javax.servlet.ServletContextクラスのgetNamedDispatcherメソッドで取得したRequestDispatcherオブジェクトのforwardメソッドでは追加されません。
-
javax.servlet.forward.request_uri
-
javax.servlet.forward.context_path
-
javax.servlet.forward.servlet_path
-
javax.servlet.forward.path_info※1
-
javax.servlet.forward.query_string※2
- 注※1
-
Webコンテナが受信したHTTPリクエストが追加のパス情報を含まない場合,この属性は追加されません。
- 注※2
-
Webコンテナが受信したHTTPリクエストのリクエストURIがクエリ文字列を含まない場合,この属性は追加されません。
これらの属性は,Webコンテナによって追加されます。javax.servlet.ServletRequestAttributeListenerに属性追加のイベントは通知されません。追加される属性の値については,Servlet 2.4仕様書を参照してください。
(3) javax.servlet.SingleThreadModelインタフェースの非推奨化について
javax.servlet.SingleThreadModelインタフェースは,Servlet 2.4仕様から非推奨となっています。
アプリケーションサーバでは,Webアプリケーションのバージョンに関係なく,javax.servlet.SingleThreadModelインタフェースを使用できます。ただし,Servlet 2.4仕様を参照し,非推奨となった理由に注意して使用してください。
(4) javax.servlet.ServletResponseクラスのsetLocaleメソッドについて
javax.servlet.ServletResponseクラスのsetLocaleメソッドによって,HTTPレスポンスのContent-Typeヘッダに文字エンコーディングが設定されます。Servlet 2.4仕様では,設定される文字エンコーディングが有効となる条件が変更されています。
アプリケーションサーバで有効となる条件を,Servlet 2.4以降とServlet 2.3に分けて示します。
- Servlet 2.4以降
-
次のすべての条件を満たす必要があります。
-
HTTPレスポンスがコミットされる前であること。
-
getWriterメソッドの呼び出し前であること。
-
setCharacterEncodingメソッドの呼び出し前であること。
-
setContentTypeメソッドによって文字エンコーディングが設定されていないこと。
条件に反する場合,setLocalメソッドは,ServletResponseクラスにロケールを設定するだけで,レスポンスの文字エンコーディングは設定しません。
-
- Servlet 2.3
-
次の条件を満たす必要があります。
-
HTTPレスポンスがコミットされる前であること※。
-
- 注※
-
-
レスポンスがコミットされる前の場合,getWriterメソッドの呼び出し前後に関係なく,文字エンコーディングが設定されます。
-
レスポンスがコミットされる前の場合,setContentTypeメソッドで文字エンコーディングが設定されているかどうかに関係なく,文字エンコーディングが設定されます。
-
(5) javax.servlet.UnavailableExceptionについて
javax.servlet.UnavailableException例外は永久的に利用できないことを示します。javax.servlet.UnavailableException例外をthrowしたサーブレット,JSPにアクセスした場合のHTTPレスポンスコードの仕様が,Servlet 2.4仕様で追記されています。
アプリケーションサーバでこの例外をthrowしたサーブレット,JSPにアクセスした場合のHTTPレスポンスコードを,Servlet 2.4以降とServlet 2.3に分けて示します。
- Servlet 2.4以降
-
404エラーとなります。
- Servlet 2.3
-
503エラーとなります。
(6) javax.servlet.http.HttpSessionListenerインタフェースのsessionDestroyedメソッドについて
javax.servlet.http.HttpSessionListenerインタフェースのsessionDestroyedメソッドを呼び出すタイミングが,Servlet 2.4仕様で変更されています。
アプリケーションサーバでこのメソッドを呼び出す場合のタイミングを,Servlet 2.4以降とServlet 2.3に分けて示します。
- Servlet 2.4以降
-
セッションが破棄される前に実行されます。
- Servlet 2.3
-
セッションが破棄されたあとに実行されます。
なお,セッションタイムアウトが無効のとき,次の順序でセッションに関するリスナが通知されます。Webアプリケーションのバージョンごとに,順序を示します。
- Servlet 2.4以降の場合
-
-
javax.servlet.http.HttpSessionListenerインタフェースのsessionDestroyed()メソッド
-
javax.servlet.http.HttpSessionBindingListenerインタフェースのvalueUnbound()メソッド
-
javax.servlet.http.HttpSessionAttributeListenerインタフェースのattributeRemoved()メソッド
-
- Servlet 2.3の場合
-
-
javax.servlet.http.HttpSessionBindingListenerインタフェースのvalueUnbound()メソッド
-
javax.servlet.http.HttpSessionAttributeListenerインタフェースのattributeRemoved()メソッド
-
javax.servlet.http.HttpSessionListenerインタフェースのsessionDestroyed()メソッド
-
(7) javax.servlet.http.HttpServletResponseクラスのsendRedirectメソッドについて
javax.servlet.http.HttpServletResponseクラスのsendRedirectメソッドを使用する条件が,Servlet 2.4仕様で変更されています。
アプリケーションサーバでこのメソッドを正常に実行するには,次の条件をすべて満たす必要があります。
-
実行するタイミングが,レスポンスがコミットされる前であること。
-
引数に適切なURLを指定すること。
この条件を満たさない場合のエラー制御を,Servlet 2.4以降とServlet 2.3に分けて示します。
- Servlet 2.4以降
-
条件を満たさない場合は,java.lang.IllegalStateException例外がthrowされます。
- Servlet 2.3
-
-
レスポンスがすでにコミットされている場合
java.lang.IllegalStateException例外がthrowされます。
-
引数に不正なURLが指定された場合
レスポンスコードが404になります。
-
(8) HTTPステータスコード302のステータスメッセージについて
Servlet 2.4仕様では,HTTPステータスコードの302を示す定数として,javax.servlet.http.HttpServletResponseクラスに「SC_FOUND」が追加されています。また,下位互換性のため,Servlet 2.3仕様で定義されていた「SC_MOVED_TEMPORARILY」はそのまま使用できます。
アプリケーションサーバでは,Webアプリケーションのバージョンに関係なく,「SC_FOUND」および「SC_MOVED_TEMPORARILY」を使用できます。
なお,ステータスメッセージの「Found」がWebコンテナで使用されるのは,次の場合です。
-
Webアプリケーションで302を返す場合
-
デフォルトエラーページが出力された場合(HTML本文中)
(9) サーブレットのサービスメソッド実行中のHttpSessionのタイムアウト
Servlet 2.4仕様では,サービスメソッド実行中のjavax.servlet.http.HttpSessionクラスでのタイムアウトについて仕様が追記されています。
アプリケーションサーバでは,Webアプリケーションのバージョンに関係なく,Webアプリケーションでのリクエスト処理を実行している間は,HttpSessionはタイムアウトされません。
また,Webアプリケーション単位またはURLグループ単位の同時実行スレッド数制御によって,リクエストが実行待ち状態の場合も,HttpSessionはタイムアウトされません。ただし,Webコンテナ単位での同時実行スレッド数制御による実行待ち状態の場合は,HttpSessionはタイムアウトされるので注意してください。
(10) リスナで例外が発生した場合の制御について
Servlet 2.4仕様では,リスナで例外が発生した場合についての記述が追加されています。
アプリケーションサーバを使用している場合で,リスナで例外が発生した場合の制御を,Servlet 2.4以降とServlet 2.3に分けて示します。
- Servlet 2.4以降
-
該当するイベントを処理するリスナが複数あっても,例外を発生したリスナ以降のリスナは,実行されません。
- Servlet 2.3
-
発生した例外はWebコンテナによってcatchされます。複数のリスナが登録されている場合,例外がcatchされたあとに,正常時と同様に登録されているリスナが順次実行されます。
(11) 共通で使用する外部のライブラリ(Extension)について
Webアプリケーションで外部のライブラリを使用する場合に記載するMANIFESTファイルの扱いについて,Servlet 2.4仕様では記述が変更されています。
アプリケーションサーバでは,Webアプリケーションのバージョンに関係なく,MANIFESTファイルの存在,およびMANIFESTファイルの内容は確認されません。
(12) サーブレットのバージョンが異なるWebアプリケーション間のクロスコンテキストの使用について
サーブレットのバージョンが異なるWebアプリケーション間で,クロスコンテキストを使用したリクエストをforwardしたあとの動作,およびincludeしたあとの動作を,次の表に示します。
項番 |
Servlet 2.4仕様の追加機能/Webアプリケーションのバージョンで違いのある機能 |
リクエストのforward先/include先の動作 |
|
---|---|---|---|
2.4から2.3にforward/include※1 |
2.3から2.4にforward/include※2 |
||
1 |
forward時またはinclude時のフィルタ適用 |
forward後/include後のサーブレット,またはJSPから,さらにforwardまたはincludeする場合,Servlet 2.4仕様が適用され,フィルタは使用できます。 |
forward後/include後のサーブレット,またはJSPからさらにforwardまたはincludeする場合,Servlet 2.3仕様が適用され,フィルタは使用できません。 |
2 |
javax.servlet.ServletRequestAttributeListenerの呼び出し |
Servlet 2.4仕様が適用され,リクエストへの属性追加時にリスナが使用できます。 |
Servlet 2.3仕様が適用され,リクエストへの属性追加時にリスナは使用できません。 |
3 |
JSPのコンパイル |
Servlet 2.3に対応したアプリケーションとしてJSPコンパイルを実行します。 |
Servlet 2.4に対応したアプリケーションとしてJSPコンパイルを実行します。 |
4 |
javax.servlet.ServletResponseクラスのsetLocaleメソッド |
Servlet 2.4仕様が適用され,次に示す条件をすべて満たす場合,文字エンコーディングの設定が有効となります。
|
Servlet 2.3仕様が適用され,レスポンスがコミットされる前である場合,文字エンコーディングの設定が有効となります。 |
5 |
永久的に利用できないことを示すjavax.servlet.UnavailableException例外をthrowしたサーブレット,JSPへのディスパッチ |
Servlet 2.3仕様が適用され,ステータス503を設定したレスポンスが返されます。 |
Servlet 2.4仕様が適用され,ステータス404を設定したレスポンスが返されます。 |
6 |
javax.servlet.http.HttpSessionListenerインタフェースのsessionDestroyedメソッド |
Servlet 2.4仕様が適用され,HTTPセッションが破棄される前に実行されます。 |
Servlet 2.3仕様が適用され,HTTPセッションが破棄されたあとに実行されます。 |
7 |
javax.servlet.http.HttpServletResponseクラスのsendRedirectメソッドに不正なURLを指定 |
Servlet 2.4仕様の仕様が適用され,java.lang.IllegalStateException例外がthrowされます。 |
Servlet 2.3の仕様が適用され,ステータス404がレスポンスに設定されます。 |
8 |
使用するリスナ定義 |
次に示すリスナの場合,forward先またはinclude先のアプリケーションで定義されたリスナが動作します。
次に示すリスナの場合,forwardまたはincludeを呼び出したアプリケーションで定義されたリスナが動作します。
|
次に示すリスナの場合,forward先またはinclude先のアプリケーションで定義されたリスナが動作します。
次に示すリスナの場合,forwardまたはincludeを呼び出したアプリケーションで定義されたリスナが動作します。
|
9 |
該当するイベントを処理するリスナがweb.xmlで複数定義されていた場合に,forwardもしくはinclude先のアプリケーション内でリスナが例外を発生したときの動作 |
次に示すリスナの場合,Servlet 2.4仕様が適用され,例外を発生したリスナ以降のリスナは実行されません。
次に示すリスナの場合,Servlet 2.3仕様が適用され,発生した例外をキャッチし,その後正常時と同様に登録されている次のリスナへ処理が移ります。
|
次に示すリスナの場合,Servlet 2.4仕様が適用され,例外を発生したリスナ以降のリスナは実行されません。
次に示すリスナの場合,Servlet 2.3仕様が適用され,発生した例外をキャッチし,その後正常時と同様に登録されている次のリスナへ処理が移ります。
|
10 |
web.xmlで指定されたエラーページを表示したレスポンスのステータスコード |
Servlet 2.4仕様が適用され,エラー発生時のステータスコードのレスポンスが返されます。 |
Servlet 2.3仕様が適用され,ステータス200のレスポンスが返されます。 |
(13) Servlet 2.4のWebアプリケーションからEJB 3.0のSession Beanを呼び出す場合
Servlet 2.4のWebアプリケーションからEJB 3.0のSession Beanを呼び出す場合は,
web.xmlに<ejb-ref>タグ,<ejb-local-ref>タグを指定しないで,サーブレットクラスに@EJBアノテーション,@EJBsアノテーションを指定してください。
J2EEサーバがサーブレットに対してEnterprise BeanのDIを実行します。