Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)


8.2.6 Servlet 2.4仕様で追加,変更された仕様についての注意事項

Servlet 2.4仕様で追加,変更された仕様を,アプリケーションサーバ上で使用するときの注意事項を示します。Servlet 2.4仕様およびServlet 2.3仕様については,それぞれの仕様書(Servlet 2.4仕様書,Servlet 2.3仕様書)を参照してください。

〈この項の構成〉

(1) X-Powered-Byヘッダの利用

Servlet 2.4仕様で追加されたX-Powered-Byヘッダはレスポンスに追加されません。

(2) java.servlet.RequestDispatcherクラスのforwardメソッド利用時の注意

javax.servlet.ServletRequestクラス,およびjavax.servlet.ServletContextクラスのgetRequestDispatcherメソッドで取得したjavax.servlet.RequestDispatcherクラスのforwardメソッドを実行すると,リクエストオブジェクトには次のキーの属性が追加されます。ただし,javax.servlet.ServletContextクラスのgetNamedDispatcherメソッドで取得したRequestDispatcherオブジェクトのforwardメソッドでは追加されません。

注※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以降の場合
  1. javax.servlet.http.HttpSessionListenerインタフェースのsessionDestroyed()メソッド

  2. javax.servlet.http.HttpSessionBindingListenerインタフェースのvalueUnbound()メソッド

  3. javax.servlet.http.HttpSessionAttributeListenerインタフェースのattributeRemoved()メソッド

Servlet 2.3の場合
  1. javax.servlet.http.HttpSessionBindingListenerインタフェースのvalueUnbound()メソッド

  2. javax.servlet.http.HttpSessionAttributeListenerインタフェースのattributeRemoved()メソッド

  3. javax.servlet.http.HttpSessionListenerインタフェースのsessionDestroyed()メソッド

(7) javax.servlet.http.HttpServletResponseクラスのsendRedirectメソッドについて

javax.servlet.http.HttpServletResponseクラスのsendRedirectメソッドを使用する条件が,Servlet 2.4仕様で変更されています。

アプリケーションサーバでこのメソッドを正常に実行するには,次の条件をすべて満たす必要があります。

この条件を満たさない場合のエラー制御を,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コンテナで使用されるのは,次の場合です。

(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したあとの動作を,次の表に示します。

表8‒20 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仕様が適用され,次に示す条件をすべて満たす場合,文字エンコーディングの設定が有効となります。

  • レスポンスがコミットされる前であること。

  • getWriterメソッドの呼び出し前であること。

  • setCharacterEncodingメソッドの呼び出し前であること。

  • serContentTypeメソッドで文字エンコーディングが設定されていないこと。

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先のアプリケーションで定義されたリスナが動作します。

  • javax.servlet.ServletContextAttributeListener

次に示すリスナの場合,forwardまたはincludeを呼び出したアプリケーションで定義されたリスナが動作します。

  • javax.servlet.ServletRequestAttributeListener

  • javax.servlet.http.HttpSessionListener

  • javax.servlet.http.HttpSessionAttributeListener

次に示すリスナの場合,forward先またはinclude先のアプリケーションで定義されたリスナが動作します。

  • javax.servlet.ServletContextAttributeListener

次に示すリスナの場合,forwardまたはincludeを呼び出したアプリケーションで定義されたリスナが動作します。

  • javax.servlet.http.HttpSessionListener

  • javax.servlet.http.HttpSessionAttributeListener

9

該当するイベントを処理するリスナがweb.xmlで複数定義されていた場合に,forwardもしくはinclude先のアプリケーション内でリスナが例外を発生したときの動作

次に示すリスナの場合,Servlet 2.4仕様が適用され,例外を発生したリスナ以降のリスナは実行されません。

  • javax.servlet.ServletRequestAttributeListener

  • javax.servlet.http.HttpSessionListener

  • javax.servlet.http.HttpSessionAttributeListener

次に示すリスナの場合,Servlet 2.3仕様が適用され,発生した例外をキャッチし,その後正常時と同様に登録されている次のリスナへ処理が移ります。

  • javax.servlet.ServletContextAttributeListener

次に示すリスナの場合,Servlet 2.4仕様が適用され,例外を発生したリスナ以降のリスナは実行されません。

  • javax.servlet.ServletContextAttributeListener

次に示すリスナの場合,Servlet 2.3仕様が適用され,発生した例外をキャッチし,その後正常時と同様に登録されている次のリスナへ処理が移ります。

  • javax.servlet.http.HttpSessionListener

  • javax.servlet.http.HttpSessionAttributeListener

10

web.xmlで指定されたエラーページを表示したレスポンスのステータスコード

Servlet 2.4仕様が適用され,エラー発生時のステータスコードのレスポンスが返されます。

Servlet 2.3仕様が適用され,ステータス200のレスポンスが返されます。

注※1

Servlet 2.4に対応したアプリケーションからServlet 2.3に対応したアプリケーションにforwardまたはincludeした場合を表します。

注※2

Servlet 2.3に対応したアプリケーションからServlet 2.4に対応したアプリケーションにforwardまたはincludeした場合を表します。

(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を実行します。