Cosminexus 機能解説
サーブレットを実装するときの注意事項を示します。
ServletResponseクラスのsetLocaleメソッドにLocale.JAPANESEを指定した場合,Content-TypeヘッダのcharsetはShift_JIS(シフトJIS)になります。
HttpServletRequestクラスのgetRequestURIメソッドでは,最適化されたURIが返されます。例えば,「xxx//yyy/zzz」は「xxx/yyy/zzz」に,「xxx/yyy/../zzz」は「xxx/zzz」のように変換されます。
WebサーバでPOSTデータの読み込みに失敗した場合,Webコンテナで動作するサーブレットでは,ServletRequestクラスの次に示すメソッドの呼び出し時にIllegalStateException例外が発生します。
ServletContextAttributeListenerインタフェース,HttpSessionAttributeListenerインタフェース,およびServletRequestAttributeListenerでは,Webコンテナが内部で使用している属性の追加,削除,更新があった場合にもイベントが通知される場合があります。通知されたイベントの属性名を参照して,Webアプリケーションで使用している属性名以外の場合には無視するようにしてください。
Webアプリケーションに含まれるディレクトリにアクセスするときは,クエリ文字列およびPOSTデータがリダイレクト先リソースで取得できないことがあるため,クエリ文字列およびPOSTデータは付けないようにしてください。
"a=b%3Dc"
1プロセス内で複数回実行してはならない処理をサーブレット中に記述する場合,サーブレットの実行とその処理が同期することがないようにしてください。特に,OTMとの通信を開始するための初期化処理の中には,インスタンスを削除しても終了しない常駐スレッドを生成するものがあります。例えば,Cosminexus TPBrokerの初期化関数であるORB.initメソッドは,呼び出されるたびにガーベージコレクション実行のための監視用常駐スレッドを生成し,このスレッドはプロセス終了まで消えません。そのため,1プロセス内でORB.initメソッドを必要以上に実行すると,不要なガーベージコレクション処理が増え,システム全体の性能が著しく低下するなどの悪影響があります。
このような事態を避けるため,プロセス中で1回だけ実行させたい処理をサーブレットに記述する場合には,その処理がプロセス中で実行済みかどうかをあらかじめ判定する必要があります。具体的には,ある処理が実行済みかどうかの状態を格納する条件フラグとしてstatic変数を任意のクラス中で用意します。static変数の値が「未実行」を意味するものである場合にだけ処理を実行し,値を「実行済み」を意味するものに変更することで,その処理の実行回数をプロセス中で1回だけに限定できます。ただし,次の2点に注意してください。
static org.omg.CORBA.ORB _orb=null; public static synchronized org.omg.CORBA.ORB getORB(String[] args, Properties props){ if(_orb==null){ _orb=org.omg.CORBA.ORB.init(args,props); } return _orb; } |
Webコンテナにゲートウェイ情報を通知し,welcomeファイルやFORM認証画面に正しくリダイレクトするゲートウェイ指定機能を使用できます。ゲートウェイ指定機能については,「4.26 Webコンテナへのゲートウェイ情報の通知」を参照してください。
ゲートウェイ指定機能を使用する場合,一部のサーブレットAPIの動作が変わります。ゲートウェイ指定機能使用時のサーブレットAPIの注意事項を,使用するメソッドごとに示します。
SSLアクセラレータや負荷分散器などのゲートウェイを使用した場合,次のサーブレットAPIの戻り値はクライアントのIPアドレスやホスト名ではなく,ゲートウェイのIPアドレスやホスト名になります。
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 |
次に示すjavax.servlet.ServletRequestクラスのメソッドは,リクエストを送信したクライアント,または最後に通ったプロキシの情報を取得するためのメソッドですが,リバースプロキシを使用した環境では,取得する情報がリバースプロキシの情報となります。
javax.servlet.ServletResponseクラスのgetWriterメソッドを実行したあとに,resetメソッドを実行した場合,HTTPレスポンスのContent-Typeで指定する文字エンコーディングは,次に示すAPIのどれか(すべてjavax.servlet.ServletResponseクラス)を使用して,再度同じ文字エンコーディングを指定してください。
Servlet 2.4仕様では,上記のAPIを使用して文字エンコーディングを設定する場合は,getWriterメソッドを実行する前に呼び出す必要があります。ただし,getWriterメソッドを実行したあとにresetメソッドを実行した場合にかぎり,再度getWriterメソッドを呼び出すまでは上記のAPIで文字エンコーディングを設定できます。
javax.servlet.http.HttpSessionのsetMaxInactiveIntervalメソッドの引数に0を指定した場合,セッションがタイムアウトになることはありません。
インプロセスHTTPサーバ機能を使用している場合に,javax.servlet.ServletRequestのgetReaderメソッドで得られるjava.io.BufferedReaderは,mark操作をサポートしていません。markSupportedメソッドではfalseが返されます。
javax.servlet.http.CookieのsetVersionメソッドの引数に1を指定した場合,Webサーバ連携機能使用時には,レスポンスにSet-Cookie2ヘッダが付加されますが,インプロセスHTTPサーバ機能使用時にはSet-Cookieヘッダが付加されます。
javax.servlet.ServletRequestのgetRequestDispatcherメソッドの引数に「/」ではじまらない相対パスを指定した場合,このサーブレットのサーブレットマッピングに指定したURLパターンからの相対パスになります。URLパターンが「/」で終わっている場合は,親のディレクトリからの相対パスになります。
例えば,サーブレットマッピングを"/a/b/"に指定したサーブレットから,"hello.html"を指定してgetRequestDispatcherメソッドを実行すると,"/a/hello.html"が得られます。
レスポンス送信時に使用されるサーブレットのバッファは,リクエスト処理スレッドごとに保持されます。javax.servlet.ServletResponseのsetBufferSizeメソッドを実行してバッファサイズを変更した場合,変更したバッファサイズは,同一J2EEサーバ上のほかのWebアプリケーションを含め,該当するスレッドが処理するすべてのリクエストに適用されます。javax.servlet.ServletResponseのsetBufferSizeメソッドを使用してバッファサイズを変更する場合は,(バッファサイズ)×(リクエスト処理スレッド数)分のメモリが確保されることを考慮した上で,メモリ使用量を見積もってください。
サーブレットでは,javax.servlet.ServletResponseクラスのsetContentTypeメソッドで明示的にContent-Typeを設定していない場合,Content-Typeヘッダを作成しません。そのため,HTTPレスポンスの文字エンコーディングをContent-Typeヘッダの”charset=”フィールドから確認することはできません。
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.