Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

4.32.2 サーブレット実装時の注意事項

サーブレットを実装するときの注意事項を示します。

<この項の構成>
(1) 入出力ストリーム利用時の注意
(2) ロケール設定時の注意
(3) URI取得時の注意
(4) POSTデータの読み込み失敗時の動作について
(5) 属性の変更に対するイベント通知時の注意
(6) ServletContextインタフェース利用時の注意
(7) Webアプリケーションに含まれるディレクトリにアクセスするときの注意
(8) ServletRequestインタフェース利用時の注意
(9) プロセス内で複数回実行してはならない処理を実装する場合の注意
(10) ゲートウェイ指定機能を使用する場合の注意
(11) ゲートウェイ使用時の注意
(12) ServletContextオブジェクトに登録する日立独自の属性
(13) ServletRequestクラスのプロキシ取得用メソッドを使用する場合の注意
(14) javax.servlet.ServletResponseクラスのresetメソッドについての注意
(15) setMaxInactiveIntervalメソッドの引数に0を指定した場合の動作
(16) java.io.BufferedReaderのmark操作について
(17) setVersionメソッドの引数に1を指定した場合の動作
(18) getRequestDispatcherメソッドでのパスの指定について
(19) setBufferSizeメソッドを使用してバッファサイズを変更する場合の注意
(20) HTTPレスポンスのContent-Typeヘッダについての注意

(1) 入出力ストリーム利用時の注意

(2) ロケール設定時の注意

ServletResponseクラスのsetLocaleメソッドにLocale.JAPANESEを指定した場合,Content-TypeヘッダのcharsetはShift_JIS(シフトJIS)になります。

(3) URI取得時の注意

HttpServletRequestクラスのgetRequestURIメソッドでは,最適化されたURIが返されます。例えば,「xxx//yyy/zzz」は「xxx/yyy/zzz」に,「xxx/yyy/../zzz」は「xxx/zzz」のように変換されます。

(4) POSTデータの読み込み失敗時の動作について

WebサーバでPOSTデータの読み込みに失敗した場合,Webコンテナで動作するサーブレットでは,ServletRequestクラスの次に示すメソッドの呼び出し時にIllegalStateException例外が発生します。

(5) 属性の変更に対するイベント通知時の注意

ServletContextAttributeListenerインタフェース,HttpSessionAttributeListenerインタフェース,およびServletRequestAttributeListenerでは,Webコンテナが内部で使用している属性の追加,削除,更新があった場合にもイベントが通知される場合があります。通知されたイベントの属性名を参照して,Webアプリケーションで使用している属性名以外の場合には無視するようにしてください。

(6) ServletContextインタフェース利用時の注意

(7) Webアプリケーションに含まれるディレクトリにアクセスするときの注意

Webアプリケーションに含まれるディレクトリにアクセスするときは,クエリ文字列およびPOSTデータがリダイレクト先リソースで取得できないことがあるため,クエリ文字列およびPOSTデータは付けないようにしてください。

(8) ServletRequestインタフェース利用時の注意

(9) プロセス内で複数回実行してはならない処理を実装する場合の注意

1プロセス内で複数回実行してはならない処理をサーブレット中に記述する場合,サーブレットの実行とその処理が同期することがないようにしてください。特に,OTMとの通信を開始するための初期化処理の中には,インスタンスを削除しても終了しない常駐スレッドを生成するものがあります。例えば,Cosminexus TPBrokerの初期化関数であるORB.initメソッドは,呼び出されるたびにガーベージコレクション実行のための監視用常駐スレッドを生成し,このスレッドはプロセス終了まで消えません。そのため,1プロセス内でORB.initメソッドを必要以上に実行すると,不要なガーベージコレクション処理が増え,システム全体の性能が著しく低下するなどの悪影響があります。

このような事態を避けるため,プロセス中で1回だけ実行させたい処理をサーブレットに記述する場合には,その処理がプロセス中で実行済みかどうかをあらかじめ判定する必要があります。具体的には,ある処理が実行済みかどうかの状態を格納する条件フラグとしてstatic変数を任意のクラス中で用意します。static変数の値が「未実行」を意味するものである場合にだけ処理を実行し,値を「実行済み」を意味するものに変更することで,その処理の実行回数をプロセス中で1回だけに限定できます。ただし,次の2点に注意してください。

(10) ゲートウェイ指定機能を使用する場合の注意

Webコンテナにゲートウェイ情報を通知し,welcomeファイルやFORM認証画面に正しくリダイレクトするゲートウェイ指定機能を使用できます。ゲートウェイ指定機能については,「4.26 Webコンテナへのゲートウェイ情報の通知」を参照してください。

ゲートウェイ指定機能を使用する場合,一部のサーブレットAPIの動作が変わります。ゲートウェイ指定機能使用時のサーブレットAPIの注意事項を,使用するメソッドごとに示します。

(11) ゲートウェイ使用時の注意

SSLアクセラレータや負荷分散器などのゲートウェイを使用した場合,次のサーブレットAPIの戻り値はクライアントのIPアドレスやホスト名ではなく,ゲートウェイのIPアドレスやホスト名になります。

(12) ServletContextオブジェクトに登録する日立独自の属性

Webコンテナは,Webアプリケーションの制御に必要な情報をjavax.servlet.ServletContextオブジェクトの属性に登録しています。WebアプリケーションでServletContextインタフェースのgetAttributeNamesメソッドによって取得する属性名には,Webコンテナによって登録された属性の名称も含まれます。

Webアプリケーション内でServletContextオブジェクトに属性を登録する時,次の文字列で開始するキー名称を使用しないでください。

また,ServletContextにはJ2EEの仕様で定められた属性も追加されるため,これらと同じキー名称の属性を登録しないでください。

Webコンテナが登録する属性の名称と意味を次の表に示します。

表4-49 ServletContextに登録する日立独自の属性

項番 キー名称 値の説明 コンテナのモード
1 org.apache.catalina.WELCOME_FILES web.xmlまたはデフォルトweb.xmlに<welcome-file-list>タグで設定された値です。 J2EE,サーブレット
2 org.apache.catalina.resources コンテキストと結び付けられるJNDIディレクトリコンテキストです。 J2EE,サーブレット
3 org.apache.catalina.jsp_classpath コンテキストに含まれるJSPのコンパイル時に使用するクラスパスです。 J2EE,サーブレット
4 com.hitachi.software.web.application-dd.J2eeApplicationName J2EEアプリケーション名です。 J2EE
5 com.hitachi.software.web.application-dd.contextRoot コンテキストルート名です。 J2EE
6 com.hitachi.software.web.dd.session-max-inactive-interval web.xmlに設定されたHTTPセッションの有効期間※1です。 J2EE
7 com.hitachi.software.web.hitachi-runtime-dd.http-session-max-number HTTPセッション数の上限値設定機能で設定されたHTTPセッション数の上限値です。 J2EE
8 com.hitachi.software.web.dd.filter-class web.xmlの最上部に定義されたフィルタマッピングのクラス名です。 J2EE
9 com.hitachi.software.web.dd.url-pattern web.xmlの最上部に定義されたフィルタマッピングのURLパターン※2※3です。 J2EE
10 com.hitachi.software.web.server-id-cookie-name サーバID付加機能によって作成されるサーバIDのHTTP Cookie名称です。 J2EE
11 com.hitachi.software.was.sfo.GIDCookieName※4 セッションフェイルオーバ機能用フィルタの初期化パラメタに設定されたグローバルセッションIDに使用するHTTP Cookie名称です。 J2EE

(凡例)
J2EE:J2EEサーバモードを表す
サーブレット:サーブレットエンジンモードを表す

注※1
web.xmlにHTTPセッションの有効期間を設定しなかった場合はデフォルトの値が登録されます。

注※2
<url-pattern>タグでなく,<servlet-name>タグが設定された場合は追加されません。

注※3
web.xml内にセッションフェイルオーバ機能用フィルタを使用するフィルタマッピングが複数定義されていた場合,URLパターンの代わりに”<multi mapped>”の文字列が登録されます。

注※4
この属性が登録されるのは,セッションフェイルオーバ機能を使用する場合だけです。

(13) ServletRequestクラスのプロキシ取得用メソッドを使用する場合の注意

次に示すjavax.servlet.ServletRequestクラスのメソッドは,リクエストを送信したクライアント,または最後に通ったプロキシの情報を取得するためのメソッドですが,リバースプロキシを使用した環境では,取得する情報がリバースプロキシの情報となります。

(14) javax.servlet.ServletResponseクラスのresetメソッドについての注意

javax.servlet.ServletResponseクラスのgetWriterメソッドを実行したあとに,resetメソッドを実行した場合,HTTPレスポンスのContent-Typeで指定する文字エンコーディングは,次に示すAPIのどれか(すべてjavax.servlet.ServletResponseクラス)を使用して,再度同じ文字エンコーディングを指定してください。

注※
Servlet 2.4仕様で追加されたメソッドです。

Servlet 2.4仕様では,上記のAPIを使用して文字エンコーディングを設定する場合は,getWriterメソッドを実行する前に呼び出す必要があります。ただし,getWriterメソッドを実行したあとにresetメソッドを実行した場合にかぎり,再度getWriterメソッドを呼び出すまでは上記のAPIで文字エンコーディングを設定できます。

(15) setMaxInactiveIntervalメソッドの引数に0を指定した場合の動作

javax.servlet.http.HttpSessionのsetMaxInactiveIntervalメソッドの引数に0を指定した場合,セッションがタイムアウトになることはありません。

(16) java.io.BufferedReaderのmark操作について

インプロセスHTTPサーバ機能を使用している場合に,javax.servlet.ServletRequestのgetReaderメソッドで得られるjava.io.BufferedReaderは,mark操作をサポートしていません。markSupportedメソッドではfalseが返されます。

(17) setVersionメソッドの引数に1を指定した場合の動作

javax.servlet.http.CookieのsetVersionメソッドの引数に1を指定した場合,Webサーバ連携機能使用時には,レスポンスにSet-Cookie2ヘッダが付加されますが,インプロセスHTTPサーバ機能使用時にはSet-Cookieヘッダが付加されます。

(18) getRequestDispatcherメソッドでのパスの指定について

javax.servlet.ServletRequestのgetRequestDispatcherメソッドの引数に「/」ではじまらない相対パスを指定した場合,このサーブレットのサーブレットマッピングに指定したURLパターンからの相対パスになります。URLパターンが「/」で終わっている場合は,親のディレクトリからの相対パスになります。

例えば,サーブレットマッピングを"/a/b/"に指定したサーブレットから,"hello.html"を指定してgetRequestDispatcherメソッドを実行すると,"/a/hello.html"が得られます。

(19) setBufferSizeメソッドを使用してバッファサイズを変更する場合の注意

レスポンス送信時に使用されるサーブレットのバッファは,リクエスト処理スレッドごとに保持されます。javax.servlet.ServletResponseのsetBufferSizeメソッドを実行してバッファサイズを変更した場合,変更したバッファサイズは,同一J2EEサーバ上のほかのWebアプリケーションを含め,該当するスレッドが処理するすべてのリクエストに適用されます。javax.servlet.ServletResponseのsetBufferSizeメソッドを使用してバッファサイズを変更する場合は,(バッファサイズ)×(リクエスト処理スレッド数)分のメモリが確保されることを考慮した上で,メモリ使用量を見積もってください。

(20) HTTPレスポンスのContent-Typeヘッダについての注意

サーブレットでは,javax.servlet.ServletResponseクラスのsetContentTypeメソッドで明示的にContent-Typeを設定していない場合,Content-Typeヘッダを作成しません。そのため,HTTPレスポンスの文字エンコーディングをContent-Typeヘッダの”charset=”フィールドから確認することはできません。