Hitachi

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


8.2.4 Servlet 3.0/3.1仕様で追加,変更された仕様についての注意事項

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

〈この項の構成〉

(1) Servlet 3.0とアプリケーションサーバの機能を組み合わせた場合の仕様

Servlet 3.0で追加された機能と,アプリケーションサーバの機能を組み合わせた場合の仕様について説明します。

(a) Webプリケーションのバージョン設定機能

Webアプリケーションのバージョン設定機能で,バージョンとして3.0以降は設定できません。

(b) META-INF/resources以下のJSP事前コンパイル

Servlet 3.0仕様では,JSPファイルをJARファイルの中のMETA-INF/resourcesの階層に含めることができるようになりましたが,META-INF/resources内にJSPを含むWebアプリケーションの場合,JSPの事前コンパイルは実行できません。JSP事前コンパイルを実行した場合,META-INF/resources内のJSPは事前コンパイルされないで,リクエスト実行時にエラーとなります。

(c) アプリケーションのリロード

Servlet 3.0/3.1仕様の機能を使用したアプリケーションをリロードする場合,次の制約があります。

META-INF/resourcesに静的コンテンツ(JSPも含む)を持つJARファイルを含むアプリケーションの場合,JARファイルを更新してリロードしても,JARファイルのMETA-INF/resources内の静的コンテンツは更新前のものにしかアクセスできません。META-INF/resourcesに静的コンテンツを持つJARファイルを含むアプリケーションをリロードした場合,KDJE39556-Wが出力されます。

注意事項

09-00-02より前のバージョンの場合,次のアプリケーションをリロードしたときの動作は保証されません。

  • ServletContainerInitializerインタフェースの実装クラスを含むアプリケーションの場合。

    リロードした場合,KDJE39557-Wが出力されます。

  • 動的サーブレット定義で追加したサーブレット,フィルタまたはリスナを含むアプリケーションの場合。

    リロードした場合,KDJE39558-Wが出力されます。

(d) APIで定義したサーブレットでのrun-as機能

APIで定義したサーブレットでrun-as機能を使用できません。次の設定をした場合,無視されます。

  • サーブレットのクラスで@RunAsアノテーションを使用する。

  • ServletRegistration.DynamicインタフェースのsetRunAsRoleメソッドを呼び出す。

(e) APIで定義したサーブレットまたはフィルタの実行時間の監視

APIで定義したサーブレットまたはフィルタでは,J2EEアプリケーションの実行時間の監視機能を使用できません。cosminexus.xmlに<method-observation-timeout>タグが設定されていても無視されます。

(f) Webアプリケーションの呼び出し時のHTTPセッションの継続

Webアプリケーションの呼び出し時のHTTPセッションの継続については,Servlet 2.5仕様の場合と同じ動作となります。詳細は,「8.2.5(6) Webアプリケーションの呼び出し時のHTTPセッションの継続について」を参照してください。

(g) アノテーション参照抑止機能

Servlet3.0で追加されたアノテーションのうち,@HandlesTypesアノテーションはアノテーション参照抑止機能の対象になりません。アノテーション参照抑止機能が有効な場合でも処理されます。

(2) Servlet 3.0以降とCDIを組み合わせた場合について

Servlet 3.0以降とCDIを組み合わせて使用する場合,Servlet 3.0以降に対応したweb.xmlを使用してください。これ以外のバージョンのweb.xmlとCDIを組み合わせて使用できません。

(3) APIで定義したフィルタまたはリスナと,@PostConstructアノテーションまたは@PreDestroyアノテーションを組み合わせた場合について

APIで定義したフィルタまたはリスナでは,@PostConstructアノテーションまたは@PreDestroyアノテーションを使用できません。これらのアノテーションを使用した場合,無視されます。

(4) インクルード時に対象のコンテンツがない場合について

Servlet 3.0仕様では,インクルードの対象がデフォルトサーブレット(静的コンテンツを提供するためにコンテナが用意しているサーブレット)で,対象のコンテンツがない場合,FileNotFoundException例外をスローすることになっています。また,その例外がユーザプログラムで処理されなかった場合,レスポンスはコミットされないで,ステータスコード500を返すことなっています。

アプリケーションサーバでは,この仕様はサポートされません。08-70以前のバージョンと同様にステータスコード404が返されます。

(5) エスケープシーケンスの使用について

Servlet 3.0以降で新規に追加されたAPIやプロパティの入力文字に,エスケープシーケンス(\b,\t,,\n,\f,\r,\",\',\\)を使用しないでください。使用した場合,ログが途中で改行されるなど,表示が不正になることがあります。

(6) 動的サーブレット定義について

動的サーブレット定義について,アプリケーションサーバで使用した場合にServlet 3.0/3.1仕様と異なる点について説明します。

(a) サーブレット,フィルタ,またはリスナの定義

  • APIおよびweb.xmlの両方でフィルタを追加した場合に,APIで定義されたほかのフィルタマッピングのisMatchAfterメソッドがfalseに設定されているときは,リクエスト処理の中でAPIの定義が先に呼ばれます。

  • APIおよびweb.xmlの両方でリスナを定義した場合,リスナの生成のときはアプリケーションの開始時にweb.xmlで定義されたリスナが先に読み込まれます。リスナを削除するときは,APIの定義が先に読み込まれます。

  • URLパターンに空文字("")を指定してjavax.servlet.ServletRegistrationインタフェースのaddMapping(String... urlPatterns)メソッドを呼び出した場合,サーブレットはコンテキスト名だけでアクセスされます。コンテキスト名も空文字("")の場合は,サーブレットにアクセスできません。

  • すでにweb.xmlで定義された名称,または@WebServletアノテーションでサーブレットクラスが生成された名称と同じサーブレット名を指定して,addServlet()メソッドを呼び出さないでください。

  • ユーザアプリケーションの中で,同じサーブレットに対してsetMultipartConfig()メソッドを呼び出し,@MultipartConfigアノテーションを指定した場合,setMultipartConfig()メソッドで指定した値が使用されます。

    同様に,ユーザアプリケーションの中で,同じサーブレットに対してsetServletSecurity()メソッドを呼び出し,@ServletSecurityアノテーションを指定した場合,setServletSecurity()メソッドで指定した値が使用されます。

  • getRunAsRole()メソッドおよびsetRunAsRole(String roleName)メソッドを使用して,ロールの取得および設定はできません。また,ワーニングメッセージまたはエラーメッセージも出力されません。

  • すでに登録されている名称でサーブレットまたはフィルタを登録した場合,アプリケーションの開始時にKDJE39552-Wが出力され,処理は続行されます。

  • URLパターンに改行コードが含まれていた場合,アプリケーションの開始時にKDJE39555-Wが出力され,処理は続行されます。

(b) ServletContainerInitializerインタフェースを使用した定義

アプリケーションサーバでのServletContainerInitializerインタフェースを使用した定義について,Servlet 3.0仕様と次の点が異なります。

  • ServletContainerInitializerインタフェースを実装したクラスを含むJARファイルは次の場所に配置できます。

    1. アプリケーションに含まれるWARファイル内のWEB-INF/libディレクトリ

    2. WEB-INF/libディレクトリ以外の場所

    WEB-INF/libディレクトリ以外の場所に,ServletContainerInitializerインタフェースを実装したクラスを含むJARファイルを配置する場合,JARファイルの絶対パスをusrconf.propertiesの次のプロパティに指定します。WEB-INF/libディレクトリにあるJARファイルを指定した場合の動作は保証しません。

    webserver.ServletContainerInitializer_jar.include.path
    設定例

    webserver.ServletContainerInitializer_jar.include.path=C:/Program Files/xxx/foo/lib/bar.jar

  • @HandlesTypesアノテーションのクラスの検索範囲は,ServletContainerInitializerインタフェースの実装クラスを含むWARの中です。WARのWEB-INF/classesディレクトリにあるクラス,およびWEB-INF/libディレクトリにあるJARファイルが対象となります。

  • ServletContainerInitializerインタフェースを実装したクラスを含むJARファイルが読み込めないか処理できない場合,アプリケーションの開始時にKDJE39548-Eが出力され,アプリケーションの開始に失敗します。

  • @HandlesTypesアノテーションで指定したクラスを継承(extends)や実装(implements)したクラス,または@HandlesTypesアノテーションで指定したクラスのアノテーションを付けているクラスを検索する際に,クラスのロードに失敗した場合,KDJE39549-Wが出力され,アプリケーションの開始処理は続行されます。

  • webserver.ServletContainerInitializer_jar.include.pathに指定した,ServletContainerInitializerインタフェースを実装したクラスを含むJARファイルが見つからない場合,またはJARファイルもしくはファイルが読み込めない場合,アプリケーションの開始時にKDJE39553-Wが出力され,処理は続行されます。このメッセージはwebserver.ServletContainerInitializer_jar.include.pathに指定されたJARファイルごとに出力されます。

  • webserver.ServletContainerInitializer_jar.include.pathに指定した,ServletContainerInitializerインタフェースを実装したクラスを含むJARファイルがクラスパスの中に見つからない場合,アプリケーションの開始時にKDJE39554-Wが出力され,処理は続行されます。このメッセージはwebserver.ServletContainerInitializer_jar.include.pathに指定されたJARファイルごとに出力されます。

(7) ファイルアップロードについて

ファイルアップロードについて,アプリケーションサーバで使用した場合にServlet 3.0/3.1仕様と異なる点について説明します。

(8) 静的リソースの配置について

静的リソースの配置について,アプリケーションサーバで使用した場合にServlet 3.0/3.1仕様と異なる点について説明します。

(9) APIについて

APIについて,アプリケーションサーバで使用した場合にServlet 3.0/3.1仕様と異なる点について説明します。

(10) web.xmlの省略について

Servlet 3.0/3.1仕様では,次のアプリケーションの場合,web.xmlを省略できます。

(11) セッションIDを示すHTTP Cookie名の変更について

セッションIDを示すHTTP Cookie名を変更する場合,Cookie名に「csfcfc」を指定できません。

また,使用できる文字に次の条件があります。条件に違反した場合,KDJE39559-Wが出力されます。セッションの不正な動作の原因になることがあるため,条件に合った文字を使用してください。

(12) Webアプリケーションで使用できるHTTP Cookie名

WebアプリケーションでHTTP Cookieを使用する場合,次の名称を指定できません。なお,大文字と小文字は区別されません。

(13) <servlet-class>要素に指定するクラスについて

web.xmlの<servlet-class>要素を省略する場合,@WebServletアノテーションを指定したjavax.servlet.http.HttpServletのサブクラスをWebアプリケーションに含め,name属性に<servlet-class>要素を省略したサーブレットのサーブレット名を設定する必要があります。該当するHttpServletクラスがない場合は,KDJE39339-Eが出力され,サーブレットクラスのロードに失敗します。

(14) <filter-class>要素に指定するクラスについて

web.xmlの<filter-class>要素を省略する場合,@WebFilterアノテーションを指定したjavax.servlet.Filterの実装クラスをWebアプリケーションに含め,filterName属性に<filter-class>要素を省略したフィルタのフィルタ名を設定する必要があります。該当するFilterクラスがない場合は,KDJE39340-Eが出力され,アプリケーションの開始に失敗します。

(15) セッションIDを示すHTTP CookieのPath属性の変更について

セッションIDを示すHTTP CookieのPath属性を変更する場合,別のWebアプリケーションとセッションIDを示すHTTP Cookie名やPath属性が重複すると,HTTP CookieのセッションIDを示す値が上書きまたは削除されるなどの理由で,HTTPセッションが正しく引き継がれなくなることがあります。

(16) セッションIDを示すHTTP CookieのPath属性とDomain属性に使用できる文字について

セッションIDを示すHTTP CookieのPath属性とDomain属性に使用できる文字には次の条件があります。条件に違反した場合,KDJE39559-Wが出力されます。セッションの不正な動作の原因になることがあるため,条件に合った文字を使用してください。

(17) 非同期サーブレットの場合の注意事項

ここでは,Servlet仕様に明記されていない挙動やServlet仕様と異なる挙動について説明します。