Cosminexus 機能解説
Cosminexus上で動作するアプリケーションのプログラムとして,サーブレット,JSPを実装するときの共通の注意事項を示します。
Webアプリケーションのバージョンは,web.xmlに記述するServlet仕様のバージョン情報で識別されます。上位のバージョンのWebアプリケーションは下位のバージョンの機能を使用できます。下位のバージョンのWebアプリケーションは上位のバージョンの機能を使用できません。
Webアプリケーションのバージョンごとに,使用できる機能範囲を次の表に示します。
表4-43 Webアプリケーションのサポート範囲
Webアプリケーションのバージョン | サーブレット | JSP | タグライブラリ※ | ||||||
---|---|---|---|---|---|---|---|---|---|
2.2 | 2.3 | 2.4 | 1.1 | 1.2 | 2.0 | 1.1 | 1.2 | 2.0 | |
2.2 | ○ | × | × | ○ | × | × | ○ | × | × |
2.3 | ○ | ○ | × | ○ | ○ | × | ○ | ○ | × |
2.4 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
(凡例)○:使用できる ×:使用できない
なお,Servlet 2.2仕様およびServlet 2.3仕様に対応したWebアプリケーションで,Servlet 2.4仕様およびJSP 2.0仕様の機能を使用した場合にエラーとなる場合があります。エラーとなる機能および処理を次の表に示します。
表4-44 Servlet 2.2/2.3仕様に対応するWebアプリケーションからServlet 2.4仕様の機能を使用した場合のエラー
仕様 | 使用する機能 | エラー時の処理 |
---|---|---|
Servlet 2.4 | 新規API呼び出し | Servlet 2.4仕様で追加されたAPIを使用したかどうかはチェックされません。呼び出した場合の動作は保証されないため呼び出さないよう注意してください。 |
新規リスナ登録 | Webアプリケーションの開始時にメッセージKDJE39297-Wがメッセージログに出力され,そのリスナ定義は無視されます。 | |
JSP 2.0 | 新規ディレクティブ新規スタンダード・アクション | サーブレットログにKDJE39145-Eのメッセージ,メッセージログにKDJE39186-Eのメッセージがそれぞれ出力され,JSPコンパイルエラーとなります。 |
タグファイル |
|
|
TLD 2.0 | 次に示すTLDファイルは,Webアプリケーション開始時にチェックされます。該当する場合,メッセージログにKDJE39293-Wが出力され,無視されます。
|
|
シンプル・タグ・ハンドラ | サーブレットログにKDJE39145-Eのメッセージを,メッセージログにKDJE39186-Eのメッセージがそれぞれ出力され,JSPコンパイルエラーとなります。 |
Servlet 2.2仕様およびServlet 2.3仕様から,Servlet 2.4仕様にWebアプリケーションのバージョンアップする場合の作業,および注意事項については,「4.32.6 既存のWebアプリケーションをServlet 2.4仕様にバージョンアップする場合の留意点」を参照してください。
サーブレット,JSPでトランザクションを利用する場合,該当するサービスメソッドでJDBCコネクションを取得し,該当するサービスメソッドが終了する前に解放してください。トランザクションが開始しているサーブレットおよびJSPでは,次に示すJDBCコネクションの使用はサポートされません。
不正なパッケージ名が指定されたクラスをサーブレットおよびJSPで使用した場合,ブラウザからアクセスしたときにステータスコード500のエラーになります。例えば,作成したクラスファイルを正しく配置して,ブラウザからアクセスしても,パッケージ名の宣言に不正があった場合は,該当クラスが見つかりません。この場合,ステータスコード500のエラーが返されます。
フォームなどで「<」や「>」などの特別な意味を持つ文字の入力値をそのまま表示した場合,悪意のあるユーザが<SCRIPT>,<OBJECT>,<APPLET>,<EMBED>のスクリプトなどを実行できるタグを使用して,重大なセキュリティ上の問題を引き起こすおそれがあります。アプリケーション開発者は,ユーザから入力されたデータに対して必ず検査をする処理を追加して,特別な意味を持つ文字を排除する必要があります。
サーブレットまたはJSPでレスポンスがコミットされたあとは,例外などのエラーが発生したとしても,次に示すエラーページはブラウザに表示されません。
レスポンスのコミットは,ユーザがServletResponseクラスのflushBufferメソッドなどを明示的に呼び出してコミットする場合以外にも,レスポンスのバッファが満杯になって自動的にWebコンテナがコミットすることがあります。
サーブレットまたはJSPでコミットされているかどうかを調べるには,ServletResponseクラスのisCommittedメソッドを使用します。また,バッファサイズの変更は,サーブレットの場合はServletResponseクラスのsetBufferSizeメソッドで,JSPの場合はpageディレクティブのbuffer属性の指定で行うことができます。
PrintWriterクラスおよびJSPWriterクラスのprintメソッドとprintlnメソッドの呼び出し回数を少なくすることで,アクセス回数を減らし,性能を向上できます。例えば,StringBufferクラスを使用し,最後にprintlnメソッドを呼び出すようにして,printおよびprintlnメソッドの呼び出し回数を削減します。
Servlet 2.3仕様で定義されているjavax.servlet.error.XXXXX属性は,web.xmlの<error-page>タグに指定されたサーブレットまたはJSP内でそのエラーページを実行する要因となったエラー情報を参照するためのものです。web.xmlの<error-page>タグに指定されたサーブレットまたはJSP以外からは,これらの属性を参照しないでください。
ファイルにアクセスする場合は,必ず絶対パスを指定してください。相対パスを指定すると,J2EEサーバはWebコンテナサーバの実行ディレクトリからの相対パスによって目的のパスを検索しようとします。ServletContextクラスのgetRealPathメソッドで相対パスを指定すると,WARファイルを展開したディレクトリでの相対パスが取得されます。
また,ファイルにアクセスする場合は,必ずファイルをクローズしてください。WARファイル展開ディレクトリでファイルにアクセスしてクローズしないと,J2EEサーバで正常にアンデプロイできなくなります。WARファイルの展開ディレクトリ下のパスを指定していない場合でもファイルをクローズしていないと,J2EEサーバの起動中にファイルを削除できないなどの現象が発生します。
JSP,サーブレットへのアクセスで例外が発生した場合,Webコンテナのデフォルトの処理では例外のステータスコードをブラウザに返します。このデフォルトの処理を変える場合はJSPのerrorPageの指定やweb.xmlでエラーページを設定してください。
J2EEアプリケーション内のコードからCosminexus Component Containerのクラスローダを取得して,次に示すメソッドを使用する場合に,java.net.JarURLConnectionクラスが使用されます。
上記メソッドが呼び出される過程でjava.net.JarURLConnectionクラスのopenConnectionメソッドが呼び出され,該当するURLに指定されたJARファイルがオープンされます。このJARファイルはcloseメソッドを明示的に呼ばないかぎり,オープンされたままになり削除できません。上記メソッドはJ2EEアプリケーション内で使用しないでください。また,JARファイルに対する操作が必要でjava.net.JarURLConnectionクラスのopenConnectionメソッドを使用する場合には,該当するJARファイルに対してcloseメソッドを必ず呼び出すようにしてください。
java.net.URLConnectionクラスはsetUseCaches(boolean)メソッドを使用して,指定されたURLに対してコネクションを取得するときにキャッシュの情報を利用するかどうかを指定できます。URLConnectionクラスに対してsetUseCaches(false)メソッドを指定した場合に,コネクションごとに対象のオブジェクトが生成されます。J2EEアプリケーション内のコードから使用する場合には,J2EEサーバのJavaVMがメモリ不足となるおそれがあります。
System.loadLibraryメソッドを使用して,サーブレットおよびJSPからネイティブライブラリをロードしないでください。サーブレットおよびJSPでネイティブライブラリをロードすると,JNI仕様の制約によって,java.lang.UnsatisfiedLinkErrorが発生することがあります。ネイティブライブラリのロードが必要な場合は,System.loadLibraryメソッドを呼び出すコンテナ拡張ライブラリを作成し,サーブレットおよびJSPからコンテナ拡張ライブラリを参照するように実装してください。コンテナ拡張ライブラリの作成については,「10. コンテナ拡張ライブラリ」を参照してください。
アプリケーションを構成するサーブレットおよびJSPからスレッドを生成して,使用できます。ユーザがプログラムの中で明示して生成するスレッドのことを,ユーザスレッドといいます。
ユーザスレッドは,生成後の動作のしかた(ライフサイクル)によって,次の二つに分けられます。
表4-45 ユーザスレッドの前提条件(サーバモード)
サーバモード | 使用可否 | |
---|---|---|
J2EEサーバモード | 1.4モード | ○ |
ベーシックモード | × | |
サーブレットエンジンモード | ○※ |
(凡例)○:使用できる ×:使用できない
ユーザスレッドを使用する場合のライフサイクルについて説明します。
サービスメソッドやinitメソッドでユーザスレッドの処理を完了させるモデルです。このモデルの処理の流れを次の図に示します。
図4-47 サービスメソッドやinitメソッドの範囲内で動作させる場合の処理
サービスメソッドやinitメソッドの呼び出しの範囲内で,ユーザスレッドを生成します。サービスメソッドやinitメソッドでは,joinメソッドによってユーザスレッドの処理が完了するのを待ってから,リターンします。
サービスメソッドやinitメソッドでユーザスレッドを生成し,その後ユーザスレッドをバックグラウンドで動作させるモデルです。このモデルの処理の流れを次の図に示します。
図4-48 サービスメソッドやinitメソッドのバックグラウンドで動作させる場合の処理
ユーザスレッドを生成したサービスメソッドやinitメソッドは,ユーザスレッドを生成したあと,処理の完了を待たないでリターンします。ただし,アプリケーションを停止したあとは,ユーザスレッドからJ2EEサービスを利用できなくなります。したがって,アプリケーションの停止によってサーブレットやJSPのdestroyメソッドが呼ばれる前に,ユーザスレッドの処理を完了しておく必要があります。
Webコンテナではセッション情報の永続化はサポートされません。Webコンテナではセッション情報は,正常,異常に関係なくWebコンテナが終了すると失われます。セッション情報を保持したい場合は,セッションフェイルオーバ機能を使用してください。
また,web.xmlで<distributable>タグを指定した場合,およびSerializableでないオブジェクトをセッション情報として登録した場合もIllegalArgumentExceptionは発生しません。
initメソッドおよびdestroyメソッドをオーバーライドしていないサーブレットを初期化または終了すると,次の形式のログがサーブレットログに出力されます。
また,JSPの場合は,pageディレクティブのextends属性で指定するJSPの基底クラスでinitメソッドおよびdestroyメソッドをオーバーライドしなかった場合,同様のメッセージが出力されます。その場合,サーブレット名は"com.hitachi.software.web.servlet-name.jsp"となります。JSPでpageディレクティブのextends属性を指定しなかった場合は,initメソッドのログだけが出力され,destroyメソッドのログは出力されません。
javax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性について,Servletで例外をスローした場合とJSPファイルで例外をスローした場合の二つに分けて説明します。
バイナリデータを含むWebアプリケーションでは,次のことに注意してください。
JSPまたはサーブレットのレスポンスボディの文字エンコードディングが,UTF-16(16ビットUCS変換形式)の場合,ブラウザによって正しく表示できない場合があります。その場合は,JSPまたはサーブレットの文字エンコードディングに,UTF-16BE(16ビットUCS変換形式のビッグエンディアンバイト順),またはUTF-16LE(16ビットUCS変換形式のリトルエンディアンバイト順)を使用してください。
getServerNameメソッド,およびgetServerPortメソッドの戻り値について説明します。
Servlet2.4仕様では,Hostヘッダの有無によって,getServerNameメソッド,およびgetServerPortメソッドの戻り値が異なります。Servlet2.4仕様でのgetServerNameメソッド,およびgetServerPortメソッドの戻り値を次の表に示します。
表4-46 getServerNameメソッド,およびgetServerPortメソッドの戻り値(Servlet2.4仕様の場合)
Hostヘッダの有無 | getServerNameメソッドの戻り値 | getServerPortメソッドの戻り値 |
---|---|---|
有り | Hostヘッダの「:」より前の部分 | Hostヘッダの「:」よりあとの部分 |
無し | 解決されたサーバ名またはIPアドレス | クライアントとの接続を受け付けたサーバのポート番号 |
Cosminexusでは,getServerNameメソッド,およびgetServerPortメソッドの戻り値は,HTTPリクエストと,使用する機能の組み合わせによって得られます。なお,HTTP 1.1のリクエストにHostヘッダが含まれない場合,HTTP 1.1仕様に従って,400エラーとなります。また,HTTP 1.1仕様では,リクエストラインのリクエストURIが絶対URIの場合,ホストにはリクエストURIのホストを使用して,Hostヘッダの内容は無視するように定義されています。なお,Servlet仕様では明記されていませんが,HTTP仕様に従って,リクエストラインのURIに含まれるホスト名を優先するようになっています。
HTTPリクエストと,使用する機能の組み合わせによって得られる,getServerNameメソッド,およびgetServerPortメソッドの戻り値を次の表に示します。なお,ゲートウェイ指定機能を使用している場合の,getServerNameメソッド,およびgetServerPortメソッドの戻り値については,表4-48を参照してください。
表4-47 getServerNameメソッド,およびgetServerPortメソッドの戻り値(Cosminexusの場合)
HTTPリクエスト | 使用する機能 | getServerNameメソッドの戻り値 | getServerPortメソッドの戻り値 | |
---|---|---|---|---|
Hostヘッダの有無 | リクエストラインのURIの種類 | |||
有り | 絶対URI | Webサーバ連携 | リクエストラインのホスト名 | リクエストラインのポート番号 |
インプロセスHTTPサーバ | リクエストラインのホスト名 | リクエストラインのポート番号 | ||
簡易Webサーバ | Hostヘッダのホスト名 | Hostヘッダのポート番号 | ||
相対URI | Webサーバ連携 | Hostヘッダのホスト名 | Hostヘッダのポート番号 | |
インプロセスHTTPサーバ | Hostヘッダのホスト名 | Hostヘッダのポート番号 | ||
簡易Webサーバ | Hostヘッダのホスト名 | Hostヘッダのポート番号 | ||
無し | 絶対URI | Webサーバ連携 | リクエストラインのホスト名 | リクエストラインのポート番号 |
インプロセスHTTPサーバ | リクエストラインのホスト名 | リクエストラインのポート番号 | ||
簡易Webサーバ | J2EEサーバのホスト名またはIPアドレス※1 | 簡易Webサーバのポート番号 | ||
相対URI | Webサーバ連携 | Webサーバのホスト名またはIPアドレス※2 | Webサーバのポート番号 | |
インプロセスHTTPサーバ | J2EEサーバのホスト名またはIPアドレス※1 | インプロセスHTTPサーバのポート番号 | ||
簡易Webサーバ | J2EEサーバのホスト名またはIPアドレス※1 | 簡易Webサーバのポート番号 |
注※1 java.net.InetAddress.getLocalHostメソッド,またはgetHostNameメソッドの戻り値となります。
注※2 Hitachi Web Serverを使用する場合,ServerNameディレクティブに指定した値となります。ServerNameディレクティブについては,マニュアル「Hitachi Web Server」を参照してください。
ゲートウェイ指定機能使用時のgetServerNameメソッド,およびgetServerPortメソッドの戻り値を次の表に示します。
表4-48 ゲートウェイ指定機能使用時のgetServerNameメソッド,およびgetServerPortメソッドの戻り値(Cosminexusの場合)
HTTPリクエスト | 使用する機能 | getServerNameメソッドの戻り値 | getServerPortメソッドの戻り値 | |
---|---|---|---|---|
Hostヘッダの有無 | リクエストラインのURIの種類 | |||
有り | 絶対URI | Webサーバ連携 | リクエストラインのホスト名 | リクエストラインのポート番号 |
インプロセスHTTPサーバ | リクエストラインのホスト名 | リクエストラインのポート番号 | ||
相対URI | Webサーバ連携 | Hostヘッダのホスト名 | Hostヘッダのポート番号 | |
インプロセスHTTPサーバ | Hostヘッダのホスト名 | Hostヘッダのポート番号 | ||
無し | 絶対URI | Webサーバ連携 | ゲートウェイ指定機能で指定したホスト名 | ゲートウェイ指定機能で指定したポート番号 |
インプロセスHTTPサーバ | リクエストラインのホスト名 | リクエストラインのポート番号 | ||
相対URI | Webサーバ連携 | ゲートウェイ指定機能で指定したホスト名 | ゲートウェイ指定機能で指定したポート番号 | |
インプロセスHTTPサーバ | ゲートウェイ指定機能で指定したホスト名 | ゲートウェイ指定機能で指定したポート番号 |
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.